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

标签 c struct padding

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

相关文章:

javascript - 使用 JavaScript 将多个 div 居中放置在流畅的布局中

CSS3 iOS 徽章文本不垂直居中

c++ - 需要帮助理解 C 函数

c++ - inportb() 和 inport() 函数有什么区别?

c - strtok 在这种情况下到底是如何工作的?

iphone - 如何在iPhone应用程序中实现UIButton/UILabel 'padding'

c++ - OpenCL 计数器变量

c - gcc 如何计算结构所需的空间?

c - 函数前缀与 C 中的 "Function Struct"

c - c传递结构数组并删除一个