我遇到了释放动态内存的问题。我已经运行了其他人的示例代码,并且它有效。关键是我们使用相同的方式来释放记忆,但我的工作并没有。它总是出现错误
" CRT检测到应用程序在堆缓冲区结束后写入内存。 "
有人能帮我理解发生了什么吗?
void pop(Stackptr *ptr){
Stackptr tmp = NULL;
if(*ptr == NULL){
printf("there is no element\n");
}else{
tmp = *ptr;
*ptr= (*ptr)->nextptr;
free(tmp);
}
}
答案 0 :(得分:4)
我可以看到,错误是
tmp = *ptr;
您希望指针本身存储为int tmp
,而不是值。
因此,下一个free(tmp);
变为非法,因为您传递的指针无效。在先前未由free()
和家人或已malloc()
- d返回的指针上调用free()
,会调用undefined behavior。
那就是if(*ptr == NULL)
应该是if(ptr == NULL)
,来检查指针的NULL值。
故事的道德:启用编译器警告。尝试解决编译器发出警告的问题。