为什么在使用" free()"内存地址的值始终为0?

时间:2017-07-04 10:49:56

标签: c malloc free

我有这段代码:

int * m = (int *)malloc(sizeof(int));
printf("%p %i\n", m, *m);
(*m) = 6;
printf("%p %i\n", m, *m);
free(m);
printf("%p %i\n", m, *m);

我在Linux上运行它。为什么内存地址的值始终为0?

为什么我在Windows上运行它会改变这个值?

2 个答案:

答案 0 :(得分:7)

让我们看看C11标准,章节§7.22.3.3。

  

free函数导致ptr指向的空间被释放,即   可供进一步分配。 [....]

因此,这意味着,传递给free()的指针不再是程序上下文中的“有效”指针。因此,尝试访问指针时,您实际上是在访问导致undefined behavior的无效内存。

现在,实际发生在内存位置和内存位置的内容上,取决于内存管理器或操作系统。它可以保持原样,除非需要通过一些其他调用再次分配它,它可以被清零,任何......超出C标准规范。

然后,我不是讲道编码风格,但我个人觉得在NULL之后立即设置free()的任意free-d指针很方便。 “大部分时间”,这将阻止指针的任何进一步使用(通过段错误),因为NULL绝对是所有上下文中的无效指针

也就是说,关于你的代码片段的一些观点,

答案 1 :(得分:0)

调用free()后,指针本身包含内存的旧地址,现在可能无效。指向的值具有不确定的值,可以是任何值。阅读它可能会导致崩溃,随机垃圾值或某种看似确定的价值 - 将会发生什么样的定义不明确。

你不知道会发生什么,也没有保证。因此,当你这样做时,思考为什么你得到一定的价值是没有意义的练习,即使是出于学习目的。你不应该访问那个内存,就像那样简单。