首页 > 代码库 > CRT detected that the application wrote to memory after end of heap buffer.
CRT detected that the application wrote to memory after end of heap buffer.
很多人的解释都不一样, 我碰到的问题是,开辟的内存空间小于操作的内存空间.也就是说,我free的内存越界了.
这是我开辟链表结构体内存的代码:
1 PNODE Create() { 2 int len; //total count of nodes to be created. 3 int i; 4 int val; //temp value for the current node. 5 printf("enter the size of nodes:"); 6 scanf("%d", &len); 7 PNODE pHead = (PNODE)malloc(sizeof(PNODE)); 8 pHead->pNext = NULL; 9 PNODE pTail = pHead;10 11 if(NULL == pHead) {12 printf("allocate memory failed!");13 exit(0);14 }15 for (i = 0; i < len; i++)16 {17 PNODE pCur = (PNODE)malloc(sizeof(PNODE));18 if(NULL == pCur) {19 printf("allocate memory failed!");20 exit(0);21 }22 printf("enter the %d-th value : ", i + 1);23 scanf("%d", &val);24 pCur->data =http://www.mamicode.com/ val;25 26 //set the new node as the tail node.27 pTail->pNext = pCur; 28 pCur->pNext = NULL;29 pTail = pCur;30 }31 return pHead;32 }
我是这样定义结构体的:
1 typedef struct node {2 int data;3 struct node * pNext;4 } NODE, * PNODE;
删除元素时(报错的代码)为:
1 bool Delete(PNODE pHead, int pos, int *v) { 2 int i = -1; 3 PNODE pNode = pHead; 4 while((i < pos - 1) && pNode != NULL) { 5 pNode = pNode->pNext; 6 i++; 7 } 8 if(pos < i || pNode == NULL) 9 return false;10 PNODE pTmp = pNode->pNext; //store to free later.11 *v = pTmp->data;12 pNode->pNext = pNode->pNext->pNext;13 free(pTmp);14 pTmp = NULL;15 return true;16 }
这段代码我翻来覆去地调试,发现所有的节点的指针域和数据域都是我期待的.就是在free的时候报了错.
原来是我开辟内存的时候,大小指定错了,应该把:
1 PNODE pNew = (PNODE)malloc(sizeof(PNODE));
改为:
1 PNODE pNew = (PNODE)malloc(sizeof(NODE));
开辟节点的大小应该为结构体的大小,其实我在‘插入‘新节点的时候,这行代码就写错了,但是不会报错.我觉得应该是没有释放.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。