在下面的程序中,据我所知,一旦我们分配了一些内存,那么如果我们正在寻找地址
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;
}
答案 0 :(得分:4)
从您将值存储到指向单个字节的int*
的那一刻起,此程序的行为 undefined 。无法保证崩溃。
具体来说,似乎你的free
没有(也许不能)正确检查其论点。尝试使用malloc
调试库运行此程序。
答案 1 :(得分:3)
没有崩溃并不一定意味着你的代码没问题。在另一个平台上,它可能会崩溃。 顺便说一句:你应该更喜欢malloc(sizeof(int))
答案 2 :(得分:1)
程序不一定会崩溃,行为未定义。
答案 3 :(得分:0)
它只能运气;代码仍然是错误的。
要理解原因,首先需要熟悉malloc库本身的实现。 malloc不仅分配它返回给你使用的空间,它还为它自己的元数据分配空间,用于管理堆(我们称之为malloc管理的内存区域)。通过更改ptr并将错误的值传递给free,元数据不再是免费预期的,因此它现在使用的数据实际上是垃圾并且堆已损坏。
这并不一定意味着它会因为一个段错误而崩溃,因为它不一定会取消引用错误的指针。该错误仍然存在,并且可能会在更长的程序中表现出来,并且堆使用量更多。