在C

时间:2015-05-24 05:36:48

标签: c pointers copy malloc free

似乎无法在别处找到我的问题的答案。

考虑代码:

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

int *dummyPtr = ptr;

free (dummyPtr);

printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);

据我了解,free()接受指针并指向NULL又名(nil)。即,指针被解除引用并且无处可指。这意味着指针指向的内存被有效擦除。

这个问题的两个部分:

  1. 如果我运行上面的代码,dummyPtr似乎仍然指向内存中的地址,而不是(nil)。为什么?
  2. ptr会怎样?它仍会指向那块内存还是已被解除引用?
  3. 我运行此代码和一些变体几次,结果相互矛盾。有时只有副本受影响,有时两者都受影响。有时指向的值甚至设置为零!

    坦率地说,我不知道发生了什么。 (我正在运行Debian,如果这有所不同。)

4 个答案:

答案 0 :(得分:4)

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

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

您的printf行会因使用无效指针而导致未定义的行为。当undefined behaviour发生时,所有赌注都已关闭。

标准参考:C11 6.2.4 / 2

  

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

附件J.2:

  

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

     
      
  • 具有自动存储持续时间的对象的值在不确定时使用
  •   

答案 1 :(得分:2)

  

free()函数释放ptr指向的内存空间   必须由之前调用malloc(),calloc()或   realloc的()。否则,或者如果之前已经调用过free(ptr),   发生未定义的行为。如果ptr为NULL,则不进行任何操作   进行。

你在哪里得到free将指针设置为NULL - 它没有。如果你想重用指针,这是你的工作。如果你没有重复使用它,那么它指向的地方没有任何区别。

答案 2 :(得分:1)

了解free()

的原型
void free(void *ptr)

函数不可能将ptr更改为指向NULL,即使它想要,ptr只是复制到函数中,因此它只能释放ptr指向的内容。

为了免费更改它需要像

这样的原型
void free(void **ptr)

一旦使用ptr指向的内存指针调用了free,因为内存已经返回给操作系统。

答案 3 :(得分:0)

Dummyptr仍然保留旧的内存位置。在释放后,prt和dummyptr都会花费,不应该被解除引用,因为这会导致未定义的行为。