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

在C中释放指向malloc'd内存的指针副本,c,pointers,copy,malloc,free,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。也就是说,指针被取消引用并且不指向任何地方。这意味着指针指向的内存被有效擦除 这个问题分为两个部分: 如果我运行上面的代码,dummyPtr

似乎在别处找不到我问题的答案

以代码为例:

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

int *dummyPtr = ptr;

free (dummyPtr);

printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);
据我所知,free接收一个指针,并使它指向NULL,也称为nil。也就是说,指针被取消引用并且不指向任何地方。这意味着指针指向的内存被有效擦除

这个问题分为两个部分:

如果我运行上面的代码,dummyPtr似乎仍然指向内存中的地址,而不是nil。为什么? ptr怎么了?它还会指向那个内存块吗?还是它也被解除了引用? 我已经运行了这段代码和一些变体几次,结果都不一致。有时只有副本受到影响,有时两者都受影响。有时指向的值甚至设置为零

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

free函数释放ptr指向的内存空间,这 必须由以前调用malloc、calloc或 realloc。否则,或者如果之前已调用freeptr, 出现未定义的行为。如果ptr为NULL,则不执行任何操作 表演


你从哪里得到的自由设置指针为空-它没有。如果要重用指针,这就是您的工作。如果您没有重用它,那么is对它指向的位置没有影响。

Dummyptr仍然保留旧的内存位置。在空闲时间之后,prt和dummyptr都将失效,不应取消引用,因为这将导致未定义的行为

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

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

printf行使用无效指针导致未定义的行为。当事情发生时,所有的赌注都没有了

标准参考文献:C116.2.4/2

指针的值在以下情况下变得不确定: 它指向或刚刚经过的对象将达到其生命周期的终点

附件J.2:

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

具有自动存储持续时间的对象的值在不确定时使用
要理解,请免费查看原型

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

为了自由改变,它需要一个像

void free(void **ptr)

一旦使用ptr指向的内存对指针调用free,则该行为是未定义的,因为内存已返回操作系统

使用%p打印未初始化的指针是否是未定义的行为?因此,如果我在ptr或dummyPtr上使用free,结果将是相同的?请参阅,特别是标题下的部分:释放内存但保留现在无效的引用如您的答案所示,但是MattMcNabb的更容易理解。这就是饼干破碎的方式:p饼干可能会破碎,也可能不会破碎;吃它只会成为一种未定义的行为。
void free(void **ptr)