考虑这段代码。 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/