我仍然对free()和malloc()感到困惑

时间:2012-05-07 08:43:43

标签: c

在下面的程序中,据我所知,一旦我们分配了一些内存,那么如果我们正在寻找地址 ptr to ptr++,然后我们使用free ptr致电free(ptr)。 然后程序应该崩溃。 但在这个程序中工作正常。 这个怎么运作? 我在Windows XP中使用Code :: Bocks。 请帮帮我。

int main()
{
    int *ptr;
    ptr = malloc(1);
    *ptr = 6;
    printf("The value at *ptr = %d \n", *ptr);
    ptr++;      //Now ptr is address has been changed
    free(ptr); // Program should crash here
    ptr = NULL;
    /* *ptr = 5;*/ // This statement is crashing
    return 0;
}

4 个答案:

答案 0 :(得分:4)

从您将值存储到指向单个字节的int*的那一刻起,此程序的行为 undefined 。无法保证崩溃。

具体来说,似乎你的free没有(也许不能)正确检查其论点。尝试使用malloc调试库运行此程序。

答案 1 :(得分:3)

没有崩溃并不一定意味着你的代码没问题。在另一个平台上,它可能会崩溃。 顺便说一句:你应该更喜欢malloc(sizeof(int))

答案 2 :(得分:1)

程序不一定会崩溃,行为未定义。

答案 3 :(得分:0)

它只能运气;代码仍然是错误的。

要理解原因,首先需要熟悉malloc库本身的实现。 malloc不仅分配它返回给你使用的空间,它还为它自己的元数据分配空间,用于管理堆(我们称之为malloc管理的内存区域)。通过更改ptr并将错误的值传递给free,元数据不再是免费预期的,因此它现在使用的数据实际上是垃圾并且堆已损坏。

这并不一定意味着它会因为一个段错误而崩溃,因为它不一定会取消引用错误的指针。该错误仍然存​​在,并且可能会在更长的程序中表现出来,并且堆使用量更多。