C语言中结构的内存分配
我正在用C语言设计一个小游戏,在Linux平台上使用C语言中结构的内存分配,c,memory-management,struct,C,Memory Management,Struct,我正在用C语言设计一个小游戏,在Linux平台上使用libX11和libpthread,所有级别信息都填充到一个结构数组level[level\u Amount] struct Pos { int X; int Y; }; struct Pos_Info { int Flag; int Drctn; int Layer; struct Pos Postn; int Color; }; struct In_Out_Chnl {
libX11
和libpthread
,所有级别信息都填充到一个结构数组level[level\u Amount]
struct Pos
{
int X;
int Y;
};
struct Pos_Info
{
int Flag;
int Drctn;
int Layer;
struct Pos Postn;
int Color;
};
struct In_Out_Chnl
{
struct Pos Drctn[Channel_Amount];
};
struct Check_Point
{
int Remain;
struct Pos Postn[Chk_Pnt_Amount];
};
struct Level_Info
{
char Map[Rbn_Col][Rbn_Row];
struct Pos_Info Draw, Rcvd;
struct Check_Point Chk_Pnt;
struct In_Out_Chnl Channel;
};
struct Level_Info Level[Level_Amount];
我不知道这是否是从文件中读取和写入结构数组的好方法,如下所示:
FILE *fp;
fwrite(&Level, sizeof(struct Level_Info), Level_Amount, fp);
fread (&Level, sizeof(struct Level_Info), Level_Amount, fp);
结构(具有不同类型的元素)的内存分配是否与编译器或CPU不同
是否有更好的方法安全地保存和读取整个结构?您可以按照建议的方式执行,但请记住,您需要遵循现有的结构布局。这意味着
- 不能更改数组维度
- 不能添加或删除数据成员
- 结构中不能有指针或类似指针的数据(似乎没有)
- 文件中的int必须与内存中的int大小相同(不能如此轻松地跨平台工作)
- 文件中的int必须与内存中的int具有相同的字节顺序(不能如此轻松地跨平台工作)
stdint.h
,并使用int32\t
等类型。对于字节顺序,您可以按网络字节顺序保存文件中的数据,然后使用套接字转换函数ntohs
和ntohl
进行字节顺序转换
请始终记住:如果您从文件中读取,则您正在处理外部输入,因此请做好准备,确保输入完全是垃圾(攻击者可能已经更改了它)
您可能还想用谷歌搜索术语
序列化
,这是一个将数据从内存写入持久存储并再次检索的过程。您可以这样做,但要注意以下几点:
- 在不同的优化级别(或编译器)下,结构将以不同的方式表示或打包。您应该使用结构打包内部函数来处理这个问题。请看这里:
- 结构中不能有包含指针的成员。如果有,指针必须是相对于内存的相对偏移量,内存保存在竞技场内。原因是,当您从文件中重新读取它们时,所有内容都将位于内存中完全不同的位置,因此指针将无效
在web上搜索数据序列化是的,可能有所不同。您应该有自己的方法一次读/写一个字段。这是使用OO语言可能会有所帮助的典型情况之一。序列化是一个非常重要的问题,请尝试一些已经实现的解决方案,例如@petrbel谢谢。我访问了该网站,目前tpl不支持内部结构上的固定长度数组后缀。我想我应该自己从头开始做所有事情。:-)您的问题与内存分配无关(例如
malloc
),您也没有告诉我们例如Channel\u Amount
是什么。我相信,有了图书馆,我会对你们有用的。