我对C很新,我对分配内存有一个疑问。因此,我在下面尝试了此代码,该代码应释放结构Elem1。
struct elem{
char *data1;
char *data2;
};
int main()
{
struct elem *elem1 = malloc(sizeof(struct elem));
elem1->data1 = "abc";
elem1->data2 = "def";
char *a = elem1->data1;
char *b = elem1->data2;
free(elem1);
printf("%sn%sn",a,b);
return 0;
}
代码可以很好地编译,然后回馈,
abc
def
我希望它会失败,因为免费的也应该释放其成员的记忆。但是为什么起作用呢?如果我想在释放结构后要访问结构的成员,该怎么办?
成员是结构的一部分。释放结构可以使所有成员交易。
但是,在您的示例中,成员只是指示。您将指针复制到结构(node->data1 = ...
(中,然后将指针复制到结构(... = node->data1
(中,然后释放结构。这些都不影响指针指向的内存。
在您的示例中,实际字符串存储在静态内存中(它们是字符串文字(。这意味着它们从未被摧毁;只要程序正在运行,它们就会生存。这就是为什么打印它们完全安全的原因。您的代码很好。
最后,访问释放的内存具有不确定的行为(这意味着任何事情都可能发生,包括程序崩溃或看起来正确工作(。如果您想访问已释放的结构的成员,那就这样做:
struct elem *p = malloc(sizeof *p);
free(p);
p->data1 = "boom!"; // Undefined behavior!
但是,这将是一个错误,所以...请不要。
每个 malloc
必须与相应的 free
保持平衡。
您的分配node->data1 = "abc";
分配了指向读取字面 "abc"
的指针,因此这里没有动态内存,因此您不得使用free
。
在您的特殊情况下,您可以保留该指针a
在struct
上调用free
的指针,因为您不必free
该内存,并且它不属于struct
。但这一般不起作用:如果您使用malloc
设置node->data1
,则(1(您必须在该指针上拨打free
您尝试在struct
上调用free
,并且(2(随后的node->data1
尊重的行为将不确定。