在malloced中的Struct里面的数组

时间:2011-10-27 12:46:56

标签: c arrays memory malloc free

我有以下代码:

#define MAX_NUMBER_OF_FRAMES 10

typedef struct my_frame_header {
    unsigned int ul_Src;
    unsigned int ul_Dest;
} MY_FRAME_HEADER;

typedef struct my_frame {
    MY_FRAME_HEADER x_FrameHeader;
    unsigned char  uc_Frame[3000];
} MY_FRAME;

int main(int argc, char *argv[])
{
    MY_FRAME *px_MyFrames;
    px_MyFrames = (MY_FRAME *)malloc(sizeof(MY_FRAME) * MAX_NUMBER_OF_FRAMES);

    // Use the x_MyFrames variable like an array
    px_MyFrames[0].uc_Frame[0] = 10;

    //free px_MyFrames
    free(px_MyFrames);

    return 1;
}

是否会成功释放所有内存?或者我需要在MY_FRAME的Init函数中使uc_Frame成为指针和malloc内存吗?然后在析构函数中为px_MyFrames的每个uc_Frame释放内存然后释放px_MyFrames? (对不起,如果有任何编译器错误,我只是动态写了给你基本的想法)。如果我把它放在这里的方式不正确,并且有记忆问题可以解释这些问题可能是什么?。

5 个答案:

答案 0 :(得分:4)

由于uc_Frame是一个数组而不是一个指针,所以这完全有效。由于它是一个数组,数据将直接存储在结构中,而结构的大小约为3008字节。所以不需要为uc_Frame malloc任何数据,因为再次它是一个数组,而不仅仅是一个指针

它会是这样的:

typedef struct my_frame {
    MY_FRAME_HEADER x_FrameHeader;
    unsigned int   ul_FrameSize;
    unsigned char *uc_Frame;
} MY_FRAME;

然后你必须动态分配(当然是免费的)uc_Frame数据,因为它只是一个指针,而不是一个数组。并且它不会存储在结构中,结构的大小只有大约16或24字节。

答案 1 :(得分:1)

它将被成​​功释放。您分配的内存空间大小为sizeof(MY_FRAME)sizeof(MY_FRAME)此处包含数组的大小,它将为sizeof(MY_FRAME_HEADER) + sizeof(unsigned char) * 3000。因此,在释放它时,将释放内存范围[px_MyFrames, px_MyFrames + sizeof(MY_FRAME))

另外,另一种常见方法是在结构中保存数组的指针,如下所示:

typedef struct my_frame {
    MY_FRAME_HEADER x_FrameHeader;
    unsigned char  *uc_Frame;
} MY_FRAME;

这次初始化和完成将是:

/* initialization */
px_MyFrames = (MY_FRAME *)malloc(sizeof(MY_FRAME) * MAX_NUMBER_OF_FRAMES);
/* and the following line matters */
px_MyFrames->uf_Frame = malloc(sizeof(ungisned char) * 3000);

/* when in finalization */
free(px_MyFrames->uf_Frame);
free(px_MyFrames);

顺便说一句,C程序在正常返回时应给出0的返回值。

答案 2 :(得分:1)

是的,通过调用free来释放内存。

检查出来:

#include <stdio.h>

typedef struct my_frame_header {
    unsigned int ul_Src;
    unsigned int ul_Dest;
} MY_FRAME_HEADER;

typedef struct my_frame {
    MY_FRAME_HEADER x_FrameHeader;
    unsigned char  uc_Frame[3000];
} MY_FRAME;

int main()
{
    printf("%d\n", sizeof(MY_FRAME));
}

运行时,会打印3008。

这意味着当您调用malloc时,它实际上为MY_FRAMEpx_MyFrames的每个实例分配了3008个字节的空间。这个空间足以容纳uc_Framex_FrameHeader。因此,您不需要自己分配uc_Framemalloc记得已经分配了3008个字节的空间,这样当你free时,所有内容都会被释放。

答案 3 :(得分:0)

不关心uc_Frame属性。你正在为MAX_NUMBER_OF_FRAMES * sizeof(MY_FRAME)正确分配内存,而你正在使用并释放它。

答案 4 :(得分:0)

是的,所有内存都将被释放。 malloc返回的区域将足以存储10 struct my_frame的全部内容。当你致电free时,它会释放整个地区。