如果我有一个结构:
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,malloc或realloc功能,或如果空间已释放通过调用free或者realloc,该行为理解过程定义网络.返回
该free函数不返回任何值.
在他们之前的回答中,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同样释放所有这些内存。