gpt4 book ai didi

c - 成员分配是否保留了结构填充字节?

转载 作者:行者123 更新时间:2023-12-01 23:41:02 25 4
gpt4 key购买 nike

示例代码:

#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 将所有填充初始化为零字节。

最佳答案

是的,它可能会失败。行为未指定,但并非未定义。

赋值s.ch = 257;后,所有填充位的值都取未指定值1,也就是说,如果结构体的第二个字节是一个填充字节,它采用未指定的值,并且未指定与零比较的结果。它可能触发也可能不触发。

断言中的读取值不能是陷阱表示,因为 unsigned char 没有陷阱表示,并且因为该值未指定,不是不确定的。


1(引自:ISO/IEC 9899:201x 6.2.6.1 General 6):
当值存储在结构或 union 类型的对象中时,包括在成员中object,对应于任何填充字节的对象表示的字节未指定的值。

关于c - 成员分配是否保留了结构填充字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40035082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com