我是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("%s\n%s\n",a,b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以很好地编译并返回,
abc
def
Run Code Online (Sandbox Code Playgroud)
我希望它会失败,因为免费还应该释放其成员的记忆。但是为什么行得通呢?释放结构后,如果我想访问结构的成员该怎么办?
成员是结构的一部分。释放结构会释放其所有成员。
但是,在您的示例中,成员只是指针。您正在将指针复制到结构(node->data1 = ...),然后从结构()中复制出来... = node->data1,然后释放该结构。这些都不会影响指针指向的内存。
在您的示例中,实际的字符串存储在静态内存中(它们是字符串文字)。这意味着它们永远不会被摧毁。只要程序运行,它们就一直存在。这就是为什么打印它们绝对安全。您的代码很好。
最后,访问释放的内存具有未定义的行为(意味着任何事情都可能发生,包括程序崩溃或看上去正常工作)。如果要访问已释放的结构的成员,请执行以下操作:
struct elem *p = malloc(sizeof *p);
free(p);
p->data1 = "boom!"; // Undefined behavior!
Run Code Online (Sandbox Code Playgroud)
但是,那将是一个错误,所以……请不要。
每个 malloc必须与相应的平衡free。
您的分配node->data1 = "abc";将一个指针分配给只读文字"abc",因此此处没有动态内存,因此您不得使用free。
在您的特定情况下,您可以保留a调用free了该指针的指针,struct因为您不必访问free该内存,并且它也不属于struct。但是,这并不工作,一般情况下:如果您使用了malloc设置node->data1则(1)你将不得不呼吁free对指针之前尝试调用free上struct,和(2)的后续尊重的行为node->data1将是不确定的。