是否释放结构指针还释放了C中结构内部分配的内存?

时间:2016-12-22 01:07:07

标签: c memory dynamic struct

例如,我有这样的结构:

typedef struct{
    char *var = (char*)malloc(20*sizeof(char));
} EXAMPLE;

EXAMPLE *point = (EXAMPLE*)malloc(sizeof(EXAMPLE));

我的第一个问题是,当我为EXAMPLE指针分配内存时,仅在结构内分配的内存是否会被分配?

我的第二个问题,当我使用free(point)时,为var分配的内存是否也会被释放?

2 个答案:

答案 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的指针,并且我们有内存泄漏。