【问题标题】:Force Specific Struct Size in C强制 C 中的特定结构大小
【发布时间】:2012-02-01 02:28:19
【问题描述】:

出于各种原因,我想强制一些结构为特定大小(在本例中为 64 字节和 512 字节)。然而,两者都低于我想要的尺寸。

我是否可以告诉编译器将它们设置为这些特定的大小并用零填充,或者我最好在结构内声明一个数组来构成多余的空间,以便它与大小对齐我要吗?

【问题讨论】:

  • 是什么原因?可能还有其他方法可以解决问题。
  • 想到使用带有字符数组的联合...
  • 您可以尝试使用#pragma pack 进行某种破解,但我不知道这会有多大用处。
  • 我正在为 OS 类做一些低级的工作,当我从磁盘读取时,块大小为 512 字节。我可以有一个暂存区,我可以在其中读取块,但我认为将关键数据结构设置为 block_size 会更优雅,这样我就可以直接读取它们。

标签: c memory struct sizeof system


【解决方案1】:

您可以使用联合。

struct mystruct_s {
    ... /* who knows how long */
};

typedef union {
    struct mystruct_s s;
    unsigned char padding[512];
} mystruct;

这将确保联合为 512 字节或更多。然后,您可以在代码中的某处使用静态断言来确保它不超过 512 个字节:

/* Causes a compiler error if sizeof(mystruct) != 512 */
char array[sizeof(mystruct) != 512 ? -1 : 1];

如果您使用的是 C11,则有更好的方法来执行此操作。我还不认识任何使用 C11 的人。该标准是在几周前发布的。

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes");

请注意,用 zeroes 填充的唯一方法是手动将零放在那里(callocmemset)。编译器会忽略填充字节。

【讨论】:

    【解决方案2】:

    我认为没有任何方法可以自动执行此操作,至少在我使用的编译器 gcc 中是这样。你必须填充你的结构。

    注意结构中的变量automatic alignment。例如 结构示例{ 字符一个; 诠释 b; }

    不占用 5 个字节,而是 8 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多