我有以下代码:
#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;
}
是否释放了所有的内存?或者我是否需要使uc_Frame在MY_FRAME的Init函数中的指针和malloc内存?然后在析构函数中释放px_MyFrames的每个uc_Frame的内存,然后释放px_MyFrames?(抱歉,如果有任何编译器错误,我只是写在飞行给你的基本思想)。如果我在这里的方式不正确并且存在记忆问题你能解释这些问题是什么吗?
由于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字节。
是,将通过调用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("%dn", sizeof(MY_FRAME));
}
运行时,打印3008。
这意味着当你调用malloc
时,它实际上为px_MyFrames
中的MY_FRAME
的每个实例分配了3008字节的空间。这个空间足够容纳uc_Frame
和x_FrameHeader
。因此,您不需要自己分配uc_Frame
。malloc
记住它已经分配了3008字节的空间,所以当你free
它时,所有的东西都被释放了。
它将被成功释放。您分配的内存空间的大小为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
。
不关心uc_Frame
属性。您确实正确地为MAX_NUMBER_OF_FRAMES * sizeof(MY_FRAME)
分配了内存,并且您正在使用和释放它
是,所有的内存将被释放。malloc
返回的区域足够大,可以存储10个struct my_frame
s的全部内容。当您调用free
时,它将释放整个区域