【发布时间】:2014-11-03 14:52:54
【问题描述】:
调用 free() 后,为我的结构分配的内存应该是 free 的。那么为什么我的代码仍在打印 l->val ?为什么尝试打印l->key时会失败?
#include <stdio.h>
typedef struct Node {
char *key;
char *val;
} Node;
int main(void) {
Node *l=malloc(sizeof(Node));
l->key="foo";
l->val="bar";
free(l);
printf("%s\n", l->val);
//printf("%s\n", l->key); /* this gives an error */
return 0;
}
【问题讨论】:
-
那么,当您已经释放了
l时,您希望l->val做什么?它已被销毁。在您尝试使用它时,没有l和l->val这样的东西。 -
C 不在乎你引用的是什么地址。摆脱例外的语言。
-
我的问题是为什么代码在被销毁后仍然打印
l->val -
为什么
printf("%s\n", l->val);仍然有效?纯属运气,记忆位置依旧完好。为什么printf("%s\n", l->key);会失败?运气不好,内存位置已经被覆盖了。 C在这种情况下就是这样。 -
它有效是因为你很幸运,但它仍然是 UB。