免费动态内存获取错误

时间:2016-02-01 05:57:00

标签: c pointers memory free

我遇到了释放动态内存的问题。我已经运行了其他人的示例代码,并且它有效。关键是我们使用相同的方式来释放记忆,但我的工作并没有。它总是出现错误

  

" 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);
    }
}

1 个答案:

答案 0 :(得分:4)

我可以看到,错误是

 tmp = *ptr;

您希望指针本身存储为int tmp,而不是值。

因此,下一个free(tmp);变为非法,因为您传递的指针无效。在先前未由free()和家人或已malloc() - d返回的指针上调用free(),会调用undefined behavior

那就是if(*ptr == NULL)应该是if(ptr == NULL),来检查指针的NULL值。

故事的道德:启用编译器警告。尝试解决编译器发出警告的问题。