侧边栏壁纸
博主头像
银河驿站博主等级

行动起来,活在当下

  • 累计撰写 85 篇文章
  • 累计创建 17 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

C语言_结构体设计与存储

Administrator
2022-05-24 / 0 评论 / 0 点赞 / 438 阅读 / 1940 字

结构体设计与存储

在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]; 
}
0

评论区