我需要在一个结构体中释放数组吗?

15
如果我有一个结构体:
struct Rec
{
    uint16_t vals[500];
};


Rec * prec = malloc(sizeof(Rec));
//Rec * prec = (Rec *) malloc(sizeof(Rec)); This code was my original and is incorrect.
//                                          See Below for details.

// initialize everything in vals

这段代码足以释放所使用的所有内存吗?

free(prec);

我是否需要单独使用free释放数组?


prec目前没有指向任何东西。您错过了代码中最重要的部分:如何分配类型为struct Rec的对象。请展示给我们看。 - sarnold
@sarnold Rec * prec = (Rec *) malloc(sizeof(Rec)); 根据我所了解的情况,由于prec是通过malloc分配的内存,因此需要使用free释放它,但是对于vals则不需要。 - providence
5
请参见:http://meta.stackexchange.com/questions/10647/howto-writing-good-titles/112966#112966。 - Mateen Ulhaq
4个回答

13

这就足够了。
你没有单独分配数组,因此只需释放已分配的指针即可。

按照规定:
您应该仅对malloc返回给您的地址调用free,否则将导致未定义行为

参考文献:
c99标准:7.20.3.2 free函数

概要
#include
void free(void *ptr);

描述:
free函数使由ptr指向的空间被解除分配,即可以使用它来重新分配。如果ptr是一个null指针,则不会发生任何操作。否则,如果参数不匹配先前由 calloc 、 malloc 或 realloc 函数返回的指针,或者如果该空间已经被调用了freerealloc释放,则行为是未定义的

返回值:
free函数不返回任何值。


7
在他们早期的回答中,tekknolagi和Als都是正确的。如果你尝试执行这段代码片段,它可能会帮助你理解发生了什么。
// cc -o test test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

struct rec {
    uint16_t vals[500];
};

int main (int argc, char const *argv[])
{
    printf("struct rec is %ld bytes.\n", sizeof(struct rec));

    struct rec* rec_p = (struct rec*)malloc(sizeof(struct rec));
    free(rec_p);
}

当您执行这段代码时,您将看到:
struct rec is 1000 bytes.

你只调用了一次 malloc 函数。这个函数调用分配了你的结构体定义所描述的所有空间。相应的 free 函数同样释放了所有这些内存空间。

5

只有在使用malloc时(或者空指针),才需要使用free

这意味着,它将在退出时自动释放。


如果您对此进行了malloc,那么就足够了。


4
Rec * prec = (Rec *) malloc(sizeof(Rec));
感谢在评论中提供了分配的内容(我已将其编辑到问题中,希望我做得对)。
使用free(3)来释放使用malloc(3)分配的内存,就像您所推测的那样。
但请注意,如果您#include <stdlib.h>,则不需要在malloc(3)中使用(Rec *)。头文件中提供的函数原型可以让编译器为您确定转换。只需包含头文件并删除强制转换即可。

2
实际上,在某些情况下,将malloc()的结果转换类型可能会隐藏错误。 - Keith Thompson
1
我不知道关于stdlib的事情。谢谢你的提示和澄清我的问题。 - providence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接