int main()
{
int *ptr, **ptr1;
ptr = (int*)malloc(sizeof(int));
ptr1 = (int**)malloc(sizeof(int));
free(ptr);
*ptr = 12345;
ptr1 = &ptr;
//free(ptr);
//**ptr1 = 23456;
printf("%d \n", **ptr1);
system("pause");
return 0;
}
当内存已经*ptr
时,12345
如何存储值freed
?所以,现在ptr
应该指向garbage
。
为什么会这样?
答案 0 :(得分:8)
在很多层面上,这段代码非常错误。
malloc()
需要ptr1
,而不是sizeof *ptr1
。这是一个指针!sizeof (int)
可能会失败。使用前请检查返回值。malloc()
之后,请勿(仅不)访问内存。未定义的行为。另请注意,当您在其上调用free()
时,指针本身不会被销毁;消失的东西是指针所指的内存。因此,如果您愿意,您仍然可以在指针本身中存储指针的位数。很少有这种情况需要这样做,并且在检查这些位时应该小心。
答案 1 :(得分:4)
指针被释放,但它仍然指向分配时的指针。执行此操作被认为是一个严重的编程错误。但运行时环境(通常)不能帮助识别或纠正此类错误。
请勿将枪对准自己并扣动扳机!
答案 2 :(得分:3)
这是未定义的行为,任何事情都可能发生。
free(ptr);
*ptr = 12345;
是非法的。它可能崩溃,或者,如果你运气不好,它似乎可以工作,可能隐藏问题,直到软件运到核电站。虽然,如果您正在编写这样的代码,那么您可能不会为这些公司工作。 :)
答案 3 :(得分:1)
您似乎无法理解未定义的行为。基本上,行为是不确定的。它可以做任何事情,包括(但不限于)以下内容:
一般来说,访问释放的内存可能(在大多数系统上)看起来好像已经有效,同时随机破坏程序的其他部分认为它拥有的数据(取决于免费后是否有分配)。 / p>
尝试定义未定义的行为会让你隐藏起来。最好不要在第一时间做到这一点。
答案 4 :(得分:0)
free()释放* ptr指向的内存,但不会更改* ptr的值,所以如果该值与其他任何内容不冲突,它仍然可以工作,但内存可能由其他进程随机分配。通常的做法是免费(ptr); ptr = NULL以避免在没有另一个malloc调用的情况下意外重用内存。