如果我有结构:
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
数组吗?
答案 0 :(得分:10)
这就足够了 你没有单独分配数组,所以只需释放分配的指针就足够了。
遵守规则:
您只应在free
返回给您的地址上致电malloc
,其他任何内容都会导致未定义的行为。
参考文献:
c99标准:7.20.3.2 free
功能
<强>概要强>
#include
void free(void * ptr);说明强>
free
函数导致ptr指向的空间被释放,即make 可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果 参数与calloc
,malloc
或之前返回的指针不匹配realloc
功能,或者如果通过调用free
或realloc
取消分配空间, 行为未定义。<强>返回强>
free
函数不返回任何值。
答案 1 :(得分:4)
使用free
(或NULL指针)
malloc
意思是,它会在退出时自动释放。
如果你有malloc
编辑,那就足够了。
答案 2 :(得分:4)
在他们早先的答案中,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
同样可以释放所有这些记忆。
答案 3 :(得分:4)
Rec * prec = (Rec *) malloc(sizeof(Rec));
感谢您在评论中加入分配(我将其编辑成问题,希望我做对了)。
要释放使用malloc(3)
分配的内存,您可以使用free(3)
,因为您已经推测。
但请注意,如果您(Rec *)
,则不需要将malloc(3)
案例与#include <stdlib.h>
一起使用。标题中提供的函数原型允许编译器为您找出强制转换。包括标题并删除演员。