2016-12-22 62 views
2

例如,我有这样的结构:释放一个结构指针还会释放C中结构内部分配的内存吗?

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

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

我的第一个问题是,结构内部分配的内存时,我的EXAMPLE指针分配内存只被分配?

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

+1

这不是有效的C代码。 – AnT

+0

我不知道为什么,但是当我提交这个问题时,它删除了星号 –

+0

'free'释放了作为产生其参数值的调用结果分配的内存。而已。不多也不少。 –

回答

2

采用这种结构:

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()的结果是,你并不意味着℃。另外请注意,我们free() point-> var之前的第一个点。这很重要,因为如果我们首先指向free(),我们会失去指向point-> var的指针,并且存在内存泄漏。

3

我忽略了,因为这个问题非编译代码是非常明确的,没有它;-)

free()号不知道它在指向的结构,所以它只是一个释放“块”。如果该块有指向其他malloced内存的指针,那么它们将被泄露(除非在其他地方有指向这些块的指针)。

+0

这意味着我还必须释放var指针吗? –

+1

是的。如果你使用malloc,那么你可以释放它(或者更广泛的说:mallocs应该负责释放它) - 如果一个库分配了内存,那么回调到这个库中应该释放它。 – John3136