我有一个结构,如
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;
blah_t
中字段大小的总和为18字节,但由于填充,sizeof(blah_t)
为20。myvar
是静态的,因此初始化为零。问题:
memset(&myvar, 0, sizeof(blah_t))
使结构的任何memcmp
有效 - 即使是静态变量。calloc(1, sizeof(blah_t))
怎么样?字节19和20是否保证为零? 我相信情况就是这样。 答案 0 :(得分:5)
从ISO C99标准:“当值存储在结构或联合类型的对象中时,包括在成员对象中,对应于任何填充字节的对象表示的字节采用未指定的值。”
进一步看,这似乎讨论了一些其他问题: Comparing structures in C vs C++
编辑:这个问题本身并不重复,但有许多常见问题需要详细回复。
答案 1 :(得分:1)
兰迪·霍华德(Randy Howard)接受的答案对于C11来说已经不太准确了。
对于静态变量,填充字节19和20是否保证为0?
。 。 。如果具有 static 或线程存储持续时间的对象未初始化 明确地,然后:。 。 。如果是集合,则根据这些规则初始化每个成员(递归),然后任何填充都初始化为零位。 。 。
其他有用和相关链接:
答案 2 :(得分:0)
填充字节19和20.对于静态,这些保证为0 变量?
见Randy Howard的回答。
calloc(1,sizeof(blah_t))怎么样?字节19/20是否保证 是零?
是。 calloc将记忆归零。
出于好奇,我想知道为什么你关心填充。可移植代码不应该打扰表示的任何方面(填充,字节顺序等)。