初始化时的C struct padding

时间:2013-03-13 00:02:01

标签: c struct padding calloc

我有一个结构,如

typedef struct
{
    int a;  // Let's say this ends up being 4 bytes
    int b;  // 4 bytes
    char text[10]; // 10 bytes
} blah_t;

static blah_t myvar;
  1. 假设blah_t中字段大小的总和为18字节,但由于填充,sizeof(blah_t)为20。
  2. myvar是静态的,因此初始化为零。
  3. 问题:

    1. 对于静态变量,填充字节19和20是否保证为0? 如果没有,我需要memset(&myvar, 0, sizeof(blah_t))使结构的任何memcmp有效 - 即使是静态变量。
    2. calloc(1, sizeof(blah_t))怎么样?字节19和20是否保证为零? 我相信情况就是这样。

3 个答案:

答案 0 :(得分:5)

从ISO C99标准:“当值存储在结构或联合类型的对象中时,包括在成员对象中,对应于任何填充字节的对象表示的字节采用未指定的值。”

进一步看,这似乎讨论了一些其他问题: Comparing structures in C vs C++

编辑:这个问题本身并不重复,但有许多常见问题需要详细回复。

答案 1 :(得分:1)

兰迪·霍华德(Randy Howard)接受的答案对于C11来说已经不太准确了。

  

对于静态变量,填充字节19和20是否保证为0?

  1. 在C11中,是的,当未明确初始化静态变量时,填充位设置为零。 C11 Standard,第6.7.9节,第10段:
  

。 。 。如果具有 static 或线程存储持续时间的对象未初始化   明确地,然后:。 。 。如果是集合,则根据这些规则初始化每个成员(递归),然后任何填充都初始化为零位。 。 。

  1. 是的,calloc会将结构的整个大小(包括填充)设为零。

其他有用和相关链接:

答案 2 :(得分:0)

  

填充字节19和20.对于静态,这些保证为0   变量?

见Randy Howard的回答。

  

calloc(1,sizeof(blah_t))怎么样?字节19/20是否保证   是零?

是。 calloc将记忆归零。

出于好奇,我想知道为什么你关心填充。可移植代码不应该打扰表示的任何方面(填充,字节顺序等)。

相关问题