C 绑定生存期怎么可能比对象生存期长?

C 绑定生存期怎么可能比对象生存期长?,c,malloc,object-lifetime,C,Malloc,Object Lifetime,我已经读到,名称到对象绑定可以比对象本身有更长的生命周期。根据我的理解,当对象被销毁时,名称和对象之间的绑定也就消失了。那么绑定生存期怎么可能比对象生存期长呢?请解释在C中使用此示例代码 char *p = malloc(4); strcpy(p, "abc"); free(p); // object gone, but binding of p, to a useless address, lives on. 这个问题的真正答案是: 那么绑定生存期怎么可能比对象生存期长呢 是:“它不能”。正

我已经读到,名称到对象绑定可以比对象本身有更长的生命周期。根据我的理解,当对象被销毁时,名称和对象之间的绑定也就消失了。那么绑定生存期怎么可能比对象生存期长呢?请解释在C中使用此示例代码

char *p = malloc(4);
strcpy(p, "abc");
free(p); // object gone, but binding of p, to a useless address, lives on.

这个问题的真正答案是:

那么绑定生存期怎么可能比对象生存期长呢

是:“它不能”。正如您所说,
p
仍然有一个值,但它不可用*因此任何“绑定”都必须被破坏。“绑定”是一种奇怪的方式来看待这个问题。我可以看到你要去哪里,但我从来没有听说过它使用的方式和你使用它的方式完全一样(在C的上下文中)

*我所说的“不可用”是指“未定义的行为”-它可能有效,但不可靠,也没有很好的理由尝试它(任何告诉你不可用的人都是在撒谎)

free(p);//对象消失了,但p绑定到一个无用的地址,仍然存在

变量p保存某个堆位置的内存地址。 当您调用free时,它会将内存返回到heap,但P仍然指向该位置,除非有人使用类似于 p=NULL。 但是如果你不改变P的值,那么

1) 如果在函数中定义了p,则它将保持值直到函数范围

2) 如果p是全局变量,它将保持值直到程序的生存期


持有已释放的地址没有任何意义。它相当于保存一些垃圾数据。

我认为一个好的开始应该是阅读堆栈与堆:我认为你需要研究一些比C更高级的语言。你比你感觉的更接近硬件。。。