动态内存分配出现错误

3
我有一个动态内存释放的问题。我运行了别人的示例代码,它可以正常工作。问题在于,我们使用了同样的方式释放内存,但我的代码没有正常工作。总是出现以下错误:

"CRT detected that the application wrote to memory after end of heap buffer."

是否有人能帮我理解发生了什么?

void pop(Stackptr *ptr){
    Stackptr tmp = NULL;
    if(*ptr == NULL){
        printf("there is no element\n");
    }else{
        tmp = *ptr;
        *ptr= (*ptr)->nextptr;
        free(tmp);
    }
}

3
Stackptr tmp 应该为 Stackptr *tmp,而 *ptr == NULL 应该为 ptr == NULL。你的其他指针也存在类似的错误。 - Marged
你的问题缺乏上下文。Stackptr是什么?ptr从哪里来?等等...发布的代码的正确性完全取决于其余的代码。换句话说,可以说你的问题不仅限于发布的代码。 - skyking
1个回答

4

据我所见,错误是

 tmp = *ptr;

你希望将指针本身存储在tmp中,而不是存储值。

因此,下一个free(tmp);就变得非法了,因为你传递的指针是无效的。在没有先前通过malloc()和家族函数返回或已经free()的指针上调用free()会引发未定义行为

话虽如此,if(*ptr == NULL)应该改为if(ptr == NULL),以检查指针的NULL值。

故事的寓意:启用编译器警告。尝试修复编译器发出警告的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接