C语言中结构的内存分配

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 {

我正在用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
{ 
   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具有相同的字节顺序(不能如此轻松地跨平台工作)
关于int问题,您可以包括
stdint.h
,并使用
int32\t
等类型。对于字节顺序,您可以按网络字节顺序保存文件中的数据,然后使用套接字转换函数
ntohs
ntohl
进行字节顺序转换

请始终记住:如果您从文件中读取,则您正在处理外部输入,因此请做好准备,确保输入完全是垃圾(攻击者可能已经更改了它)


您可能还想用谷歌搜索术语
序列化
,这是一个将数据从内存写入持久存储并再次检索的过程。

您可以这样做,但要注意以下几点:

  • 在不同的优化级别(或编译器)下,结构将以不同的方式表示或打包。您应该使用结构打包内部函数来处理这个问题。请看这里:

  • 结构中不能有包含指针的成员。如果有,指针必须是相对于内存的相对偏移量,内存保存在竞技场内。原因是,当您从文件中重新读取它们时,所有内容都将位于内存中完全不同的位置,因此指针将无效

此外,我建议您使用内存映射——它不仅可以提供更高的性能,而且可以通过一些特定于操作系统的代码教会它在结构变大时自动增长文件


在web上搜索数据序列化是的,可能有所不同。您应该有自己的方法一次读/写一个字段。这是使用OO语言可能会有所帮助的典型情况之一。序列化是一个非常重要的问题,请尝试一些已经实现的解决方案,例如@petrbel谢谢。我访问了该网站,目前tpl不支持内部结构上的固定长度数组后缀。我想我应该自己从头开始做所有事情。:-)您的问题与内存分配无关(例如
malloc
),您也没有告诉我们例如
Channel\u Amount
是什么。我相信,有了图书馆,我会对你们有用的。