在 C 中释放指向 malloc 内存的指针的副本

jam*_*625 1 c malloc free pointers copy

似乎在其他地方找不到我的问题的答案。

考虑代码:

int *ptr = malloc (sizeof (*ptr));

int *dummyPtr = ptr;

free (dummyPtr);

printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);
Run Code Online (Sandbox Code Playgroud)

据我了解,free()接受一个指针并使其指向NULLaka (nil)。即,指针被取消引用并且指向任何地方。这意味着指针指向的内存被有效擦除。

这个问题分为两个部分:

  1. 如果我运行上面的代码,dummyPtr似乎仍然指向内存中的地址而不是(nil). 为什么?
  2. 会发生什么ptr?它仍然指向该内存块还是也被取消引用?

我已经多次运行此代码和某些变体,但结果相互矛盾。有时只有副本受到影响,有时两者都受到影响。有时指向的值甚至设置为零!

坦白说,我不知道发生了什么事。(我正在运行 Debian,如果这有什么区别的话。)

M.M*_*M.M 5

free不将指针设置为 NULL ,或擦除任何内存。相反,它将指针指向的内存块标记为空闲(即未分配)。

调用 后free(dummyPtr), 和ptr现在dummyPtr都是无效指针,因为它们不指向已分配的内存块。

您的printf行通过使用无效指针导致未定义的行为。当未定义的行为发生时,所有的赌注都会失败。


标准参考:C11 6.2.4/2

当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。

附件 J.2:

在以下情况下,该行为是未定义的:

  • 具有自动存储期限的对象的值在不确定时使用