gpt4 book ai didi

c - 访问结构或 union 中的填充是否安全?

转载 作者:太空狗 更新时间:2023-10-29 15:41:34 26 4
gpt4 key购买 nike

考虑这段代码。 padding 的存在是有保证的。

static_assert(_Alignof(char) < _Alignof(double), "Flip!");
static_assert(sizeof(char) < sizeof(double), "Flop!");

struct S {
char c[1];
double d;
};
union U {
char c[1];
double d;
};

static_assert(sizeof(struct S) == _Alignof(double) * sizeof(double), "Fudge!");
static_assert(sizeof(union U) == sizeof(double), "Futz!");

S s; U u;
s.c[1] = 0; // What?
u.c[1] = 0; // What?

对于那些 static_assert,可以肯定在中间或末尾有填充。访问它们安全吗?

最佳答案

memcpy()memset() 或类似的整个结构是安全的,即使它包含填充位。但是,不能对填充保留其值做出任何假设。

因此,访问填充位的唯一用途是不必编写代码来避免在某些情况下访问它。

对于像 memcmp() 这样的操作,访问填充位仍然是错误的,因为结果是不可预测的。

关于c - 访问结构或 union 中的填充是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47960995/

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