-1

在下面的程序中,据我所知,一旦我们分配了一些内存,那么如果我们正在从 chaging 地址 ptr to ptr++,那么当我们free使用ptrie调用时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

4 回答 4

4

从您通过指向单个字节存储值的那一刻起,该程序的行为就未定义。int*不能保证会崩溃。

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

于 2012-05-07T08:47:36.613 回答
3

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

于 2012-05-07T08:46:54.303 回答
1

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

于 2012-05-07T08:47:28.000 回答
0

它只因运气而起作用;代码仍然是错误的。

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

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

于 2012-05-07T08:51:31.107 回答