例如,我有这样的结构:
typedef struct{
char *var = (char*)malloc(20*sizeof(char));
} EXAMPLE;
EXAMPLE *point = (EXAMPLE*)malloc(sizeof(EXAMPLE));
我的第一个问题是,当我为EXAMPLE
指针分配内存时,仅在结构内分配的内存是否会被分配?
我的第二个问题,当我使用free(point)
时,为var
分配的内存是否也会被释放?
答案 0 :(得分:3)
我忽略了非编译代码,因为如果没有它,问题就很清楚了; - )
没有。 free()
不知道它所指向的结构,所以它只释放了一个" block"。如果该块具有指向其他malloced内存的指针,则它们会被泄露(除非在其他地方有指向这些块的指针)。
答案 1 :(得分:3)
使用此结构:
typedef struct{
char *var;
} EXAMPLE;
请记住,为结构分配空间时,只需为char *
指针分配空间。这个指针只指向其他地方的内存。当你free()
结构时,你只需要释放char *
指针,而不是它指向的实际内存。
因此,如果您为要malloc()
指向的字符串创建此结构然后var
空格,则需要free()
字符串以及free()
结构。
一些代码演示了这可能如何起作用:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct {
char *var;
} EXAMPLE;
int main(int argc, char *argv[]) {
// malloc() space for the EXAMPLE struct.
EXAMPLE *point = malloc(sizeof(EXAMPLE));
// malloc() space for the string that var points to.
point->var = malloc(20 * sizeof(char));
// Copy "Hello!" into this memory (care with strcpy).
strcpy(point->var, "Hello!");
// Print it, it works!
printf("point->var is: %s\n", point->var);
// Free stuff.
free(point->var);
free(point);
return 0;
}
另请注意,我们不会将malloc()
的结果投射到C中,而您不应该这样做。另请注意,我们free()
点 - &gt; var在点之前。这很重要,因为如果我们free()
指向第一个,我们将失去指向point-&gt; var的指针,并且我们有内存泄漏。