我有以下代码:
#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? (对不起,如果有任何编译器错误,我只是动态写了给你基本的想法)。如果我把它放在这里的方式不正确,并且有记忆问题可以解释这些问题可能是什么?。
答案 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_FRAME
中px_MyFrames
的每个实例分配了3008个字节的空间。这个空间足以容纳uc_Frame
和x_FrameHeader
。因此,您不需要自己分配uc_Frame
。 malloc
记得已经分配了3008个字节的空间,这样当你free
时,所有内容都会被释放。
答案 3 :(得分:0)
不关心uc_Frame
属性。你正在为MAX_NUMBER_OF_FRAMES * sizeof(MY_FRAME)
正确分配内存,而你正在使用并释放它。
答案 4 :(得分:0)
是的,所有内存都将被释放。 malloc
返回的区域将足以存储10 struct my_frame
的全部内容。当你致电free
时,它会释放整个地区。