c语言单链表基本书写中的内存溢出报错

#include<stdio.h>
#include<stdlib.h>


struct Node
{
	int info;
	struct Node *link;
};
typedef struct Node * LinkList;/*单链表类型*/

//头插法建立单链表  
LinkList createNullList() {
	int x;
	char str;
	LinkList _list = (LinkList)malloc(sizeof(struct Node));/*表头节点空间*/
	
	
		
	if (_list != NULL)//如果内存不足,将null
		_list->link = NULL;//设置为空链表
	
	while (scanf_s("%d", &x) != EOF)//while(scanf("%d",&x) != EOF) (str = getchar()) != '\n'或者可以用这个
	{
		
		

		//LinkList llist = (LinkList)malloc(sizeof(Pnode));
		LinkList llist = (LinkList)malloc(sizeof(struct Node));
		
		llist->info = x;
		llist->link=_list->link;
		_list->link = llist;
	}
	
	return _list;
}
//尾插法建立单链表(l会随着新节点产生下移)
LinkList createNullList2() {
	int x;
	
	LinkList _list = (LinkList)malloc(sizeof(struct Node));/*表头节点空间*/
	_list->link = NULL;
	LinkList l;
	l = _list;

	while (scanf_s("%d",&x)!=EOF)
	{
		LinkList llist = (LinkList)malloc(sizeof(struct Node));
		llist->info = x;
		l->link = llist;
		l = llist;
	}
	l->link = NULL;
	return _list;
}

//单链表的增删改查操作
LinkList Insert(LinkList L, int i, int x) {
	//先找到要加入的节点的前驱节点
	int z;
	LinkList p ;
	p = L;
	
	for (z = 1; z < i; z++) {
		p = p->link;
	}


	//再创建新节点,换一下指针域
	LinkList n = (LinkList)malloc(sizeof(struct Node));
	n->info = x;
	n->link = p->link;
	p->link = n;

	return L;
}

LinkList LinkedListDelete(LinkList L, int x)
{
	int z;
	LinkList p,q;
	q = L;
	//pre为前驱结点,p为查找的结点。   
	p = L->link;
	while (p->info!= x)              //查找值为x的元素   
	{
		q = p;
		p = p->link;
	}
	q->link = p->link;//删除操作,将其前驱next指向其后继。   
	p->link = NULL;
	free(p);
	return L;
}

//LinkList Delet(LinkList L, int i,int x) {
//	//删除值为x的节点,或者第几个节点
//	//先找到要删除的节点和前驱节点
//	int z;
//	Pnode p,q;
//	p = L;
//	q = L;
//	if (i != NULL) {
//		for (z = 1; z < i; z++) {
//			q = p;
//			p = p->link;
//		}
//		q->link = p->link;
//		free(p);
//	}
//	if (x != NULL) {
//		while (p->info!=x)
//		{
//			q = p;
//			p = p->link;
//		}
//		q->link = p->link;
//		free(p);
//	}
//	return L;
//}
void main() {
	LinkList ll = createNullList();

	//测试添加
	ll = Insert(ll, 4, 9);
	//ll = Delet(ll,NULL,2);
	ll = LinkedListDelete(ll,2);
	for (ll = ll->link; ll != NULL; ll = ll->link) {
		printf("%d", ll->info);
	}
	
}

没错,就是这里
//LinkList llist = (LinkList)malloc(sizeof(Pnode));
LinkList llist = (LinkList)malloc(sizeof(struct Node));

!!!
heap corruption detected:after normal block(#xxx) at 0x xxxxxxxx
crt detected that the application wrote to menory after end of heap buffer
这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.
出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.比如说如下部分:
char* p=new char[5];
strcpy(p,“aaaaa”);
delete[] p;
这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作.
!!!
结构申请空间的时候别把
p =(struct student *)malloc(sizeof(struct student));
写成
p =(struct student *)malloc(sizeof(struct student *));
!!!
C语言释放链表时的问题
http://zhidao.baidu.com/question/38250738

current = head;
while (current != NULL)
{
free(current);
current=current->next;
}

改为

//释放字符子串链表空间
current = head;
while (current != NULL)
{
temp=current;
current=current->next;
free(temp);
}

发布了43 篇原创文章 · 获赞 8 · 访问量 3931

猜你喜欢

转载自blog.csdn.net/MaYang_/article/details/100753501
今日推荐