记忆和先生结构

pro*_*nce 14 c memory struct

如果我有一个结构:

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
Run Code Online (Sandbox Code Playgroud)

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

free(prec);
Run Code Online (Sandbox Code Playgroud)

或者我是否需要free单独使用阵列?

Alo*_*ave 11

这就足够了.
你没有单独分配数组,所以只需释放分配的指针就足够了.

遵循规则:
您应该只调用free返回给您的地址malloc,其他任何内容都将导致未定义的行为.

参考文献:
c99标准:7.20.3.2该free功能

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

描述:
free函数导致ptr指向的空间被释放,即可用于进一步分配.如果ptr是空指针,则不执行任何操作.否则,如果该参数不匹配的指针早些时候返回calloc,mallocrealloc功能,或如果空间已释放通过调用free或者realloc,该行为理解过程定义网络.

返回
free函数不返回任何值.


tek*_*agi 5

free仅当您使用malloc(或 NULL 指针)时才使用

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


如果你已经malloc这样做了,那就足够了。


Jam*_*mes 5

在他们之前的回答中,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);
}
Run Code Online (Sandbox Code Playgroud)

当你执行这段代码时,你会看到:

struct rec is 1000 bytes.
Run Code Online (Sandbox Code Playgroud)

malloc只打过一次电话。该调用分配了您的结构定义所描述的所有空间。匹配free同样释放所有这些内存。