4

我有一个结构,例如

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. 假设 中字段大小的总和为 18 个字节blah_t,但sizeof(blah_t)由于填充而为 20。
  2. myvar是静态的,因此它将被零初始化。

问题:

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

3 回答 3

5

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

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

编辑:不是这个问题本身的重复,而是许多常见问题的详细回答。

于 2013-03-13T00:05:10.080 回答
1

兰迪霍华德接受的答案对于 C11 来说不再准确。

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

  1. 在 C11 中,是的,当静态变量未显式初始化时,填充位设置为零。C11 标准,子条款 6.7.9,第 10 段:

. . . 如果具有静态或线程存储持续时间的对象未显式初始化,则:. . . 如果是聚合,则每个成员都根据这些规则(递归地)初始化,并且任何填充都被初始化为零位。. .

  1. 是的,calloc 会将结构的整个 sizeof(包括填充)归零。

其他有用的相关链接:

于 2019-08-14T20:10:04.690 回答
0

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

请参阅兰迪霍华德的回答。

calloc(1, sizeof(blah_t) ) 呢?字节 19/20 是否保证为零?

是的。calloc 将内存归零。

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

于 2013-03-13T00:32:33.633 回答