记忆和先生结构

时间:2011-11-20 06:04:05

标签: 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

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

free(prec);

或者我必须单独free数组吗?

4 个答案:

答案 0 :(得分:10)

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

遵守规则:
您只应在free返回给您的地址上致电malloc,其他任何内容都会导致未定义的行为

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

  

<强>概要
     #include
  void free(void * ptr);

     

说明
   free函数导致ptr指向的空间被释放,即make   可供进一步分配。如果ptr是空指针,则不执行任何操作。 否则,如果   参数与callocmalloc或之前返回的指针不匹配   realloc功能,或者如果通过调用freerealloc取消分配空间,   行为未定义

     

<强>返回
   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>一起使用。标题中提供的函数原型允许编译器为您找出强制转换。包括标题并删除演员。