【发布时间】:2017-02-23 09:48:46
【问题描述】:
示例代码:
#include <assert.h>
struct S
{
unsigned char ch;
int i;
};
int main()
{
struct S s;
memset(&s, 0, sizeof s);
s.ch = 257;
assert( 0 == ((unsigned char *)&s)[1] );
}
断言会失败吗?
这个问题的动机是小端系统上的编译器是否可以决定使用 4 字节存储来实现s.ch = 257;。显然,没有人会像我在示例中那样编写代码,但如果在程序中以各种方式分配 ch,然后继续使用 memcmp 检查结构是否相等,则可能会发生类似的事情。
例如,如果代码使用--s.ch 而不是s.ch = 257 - 编译器可以发出字长递减指令吗?
我认为围绕DR 451 的讨论无关紧要,因为这只适用于未初始化的填充;但是memset 将所有填充初始化为零字节。
【问题讨论】:
标签: c struct language-lawyer padding