访问结构或联合中的填充是否安全?

时间:2017-12-24 13:29:24

标签: c struct 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,它确定在中间或末尾有填充。访问它们是否安全?

1 个答案:

答案 0 :(得分:0)

memcpy()memset()或类似整个结构是安全的,即使它包含填充位。但是,没有关于填充保留其值的假设。

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

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

相关问题