我调用free(),但指针仍然有数据,它的内容没有改变

代码如下。

我的问题是结果。 我想明白,为什么在调用free(p)p-> elem变为’0’之后,但是p-> str仍然包含“hello”?

#define LEN (sizeof(struct node)) typedef struct node { int elem; char *str; }*p_node; int main(void) { p_node p; p=(p_node)malloc(LEN); p->elem=99; p->str="hello"; printf("the p->elem:%d\n",p->elem); printf("the p->str :%s\n",p->str); free(p); printf("the p->elem:%d\n",p->elem); printf("the p->str :%s\n",p->str); return 0; } 

http://i.stack.imgur.com/rt1jf.png

释放内存实际上并没有清除它所指向的指针或内存(除非在特殊情况下有助于调试这样的问题 – 尽管从不依赖于行为)。 在释放它指向的内存后使用指针是无效的,并且是未定义的行为 。 它也可能崩溃,或导致随机值打印。

另外,在C中你不应该转换malloc的返回值 。

首先,永远不要在实际代码中这样做。 您的代码现在只能工作,因为其他分配尚未声明内存,并且仍然存在旧分配结构的“重影”。

在实际问题上,你的p-> str指针指向一个常量文字,即在应用程序数据中“硬编码”的一段文本。 因此,指向它的指针在整个应用程序生命周期内都是有效的 – 这是一个“更有效”的例子:

 p_node p; p=(p_node)malloc(LEN); p->elem=99; p->str="hello"; char* pstr = p->str; free(p); printf("the pstr :%s\n",pstr); // still outputs "hello", because pstr would be just a pointer to "hardcoded" data