C语言_结构体设计与存储
结构体设计与存储
在C语言中,组织数据常常使用结构体,在结构体设计中需要注意的有结构体对齐,结构体中存在平台相关变量,结构体中存在指针的情况。下面就上述几种情况讨论一下结构体的设计。
结构体对齐
结构体对齐的情况会影响内存分配和结构体存储,同时在32和64位系统中,结构体对齐的情况也不相同。在跨平台的结构体设计中,将结构体设置为1字节对齐,这样在进行sizeof取结构体长度,可以得到实际长度,消除跨平台影响。
#pragma pack(1) /** 1字节对齐 **/
struct store_data
{
char a;
int b;
short c
}
结构体中存在平台相关变量
结构体中存在平台相关变量,主要指结构体中存在unsigned long成员。在对含有平台相关变量进行直接存储后,如果数据存在跨平台流动,则会出现兼容性问题。其问题主要出现在sizeof(unsigned long)在32位系统和64位系统所占空间不同。对于unsigned long,可以使用long long或者int进行替换。
#pragma pack(1)
struct store_data
{
int index;
short age
//unsigned long length;
unsigned int length;
}
结构体变量中存在指针
结构体变量中存在指针,其本质和上面的问题一样,在不同平台其占内存空间不同。例如:
#pragma pack(1)
struct store_data
{
unsigned int length;
char* data;
}
在对上述结构体以及数据进行存储的过程中,指针所占空间在文件中为占位空间,在跨平台中读取存在兼容问题。对于结构体中存在指针情况,通常使用使用unsigned long long解决。
#pragma pack(1)
struct store_data
{
unsigned int length;
unsigned long long data; /** 使用8字节unsigned long long保存指针 **/
}
同时也可以使用char data[1]进行占位处理
#pragma pack(1)
struct store_data
{
unsigned int length;
unsigned char data[1];
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 银河驿站
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果