在C中释放变量大小的结构

时间:2010-07-27 23:40:11

标签: c struct free variable-length

我使用的是可变大小的C结构,如下所示:

typedef struct {  
  int num_elems;  
  int elem1;  
} mystruct;  
// say I have 5 elements I would like to hold.  
mystruct * ms = malloc(sizeof(mystruct) + (5-1) * sizeof(int));  
ms->num_elems = 5;  
// ... assign 5 elems and use struct  
free(ms);

这最后一次free()会释放malloc所有的东西,还是只有sizeof(mystruct)?

2 个答案:

答案 0 :(得分:4)

是。这将释放使用malloc分配的整个块。

如果使用malloc分配单个内存块(就像您在示例中所做的那样),那么您需要调用free一次以释放整个块。

答案 1 :(得分:2)

在执行此类操作时要注意的一件事是,free /用于确定要释放的内存的分配记录是由malloc创建的,并与地址malloc返回相关联。

这意味着您可以在指向malloc块的第一个字节的任何指针上调用free,它将释放正确的内存块,但是如果您在块中的任何地址上调用free而不是第一个字节,你最多只能使用SIGSEV或SIGBUS,最坏的情况是破坏分配表,导致奇怪和无法解释的行为。

因此,如果你有像这样的块分配mystruct,小心不要将它们与单个分配的mystruct混合,否则你会发现自己面临泄漏内存和破坏内存之间的讨厌选择。