C中结构的内存分配

时间:2014-06-24 10:51:37

标签: c memory-management struct

我正在使用Linux平台上的libX11libpthread在C中设计一个小游戏,所有级别信息都填充到结构数组Level[Level_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];

我很困惑它是否是从文件中读取和编写struct数组的好方法,如下所示:

FILE *fp;
fwrite(&Level, sizeof(struct Level_Info), Level_Amount, fp);
fread (&Level, sizeof(struct Level_Info), Level_Amount, fp);

结构(具有不同类型的元素)的内存分配是否会与编译器或CPU不同?

有没有更好的方法来保存和阅读整个结构安全

2 个答案:

答案 0 :(得分:0)

您可以按照建议的方式进行操作,但请记住,您需要坚持使用结构布局。这意味着

  • 您无法更改数组维度
  • 您无法添加或删除数据成员
  • 你不能在结构中有指针或类似数据的指针(你好像没有这样)
  • 文件中的int必须与内存中的int相同(不能轻易跨平台工作)
  • 文件中的int必须与内存中的int具有相同的字节顺序(不能轻易跨平台工作)

关于int问题,您可以包含stdint.h并使用类似int32_t的类型。对于字节顺序,您可以按网络字节顺序保存文件中的数据,然后使用套接字转换函数ntohsntohl进行字节顺序转换。

始终牢记:如果你从一个文件中读取,你正在处理外部输入,那么请准备好输入是完全垃圾(攻击者可能已经改变了它)。

您可能还希望Google使用术语serialization作为流程或将数据从内存写入持久存储并再次检索它。

答案 1 :(得分:0)

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

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

http://en.wikipedia.org/wiki/Memory-mapped_file