The*_*ton 5 c struct padding memory-alignment unions
我有以下内容:
#include <stdio.h>
typedef union u_data
{
struct
{
int a;
int b;
int c;
};
int elem[3];
} my_data;
int main(void)
{
my_data data;
data.a = 3;
data.b = 5;
data.c = -3;
printf("%d, %d, %d\n", data.elem[0], data.elem[1], data.elem[2]);
}
Run Code Online (Sandbox Code Playgroud)
它按照我的预期输出:3, 5, -3
但是我知道结构中可以有填充,所以这是否意味着结构中的元素可能并不总是与数组对齐?
首先,C、C11 6.5.2.3 中的并集有一个特殊规则“共同初始序列”:
为了简化联合的使用,做出了一项特殊保证:如果联合包含多个共享公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许检查公共初始序列它们中任何一个联合的完整类型声明可见的地方的初始部分。
不过,此规则不适用于此处,因为您的情况是一个结构体和一个数组。如果它是两个结构,则该规则将适用。
事实上,结构可能有填充,因此如果数组的对齐方式与结构不同,则不能保证获得正确的输出。这是实现定义的行为。
写入结构体和读取数组在 C(与 C++)、C11 6.5.2.3/3 中很好且定义良好,因为这两种类型是兼容的。仅当没有填充字节时,该结构才能与数组兼容。
“严格别名”在这里不适用。
摘要:这是实现定义的行为。如果编译器保证的话,您可以依赖特定系统上的特定行为。该代码不可移植。
| 归档时间: |
|
| 查看次数: |
1391 次 |
| 最近记录: |