在严格的c 89中是否很好地定义了struct? 我的意思是这段代码
struct a {
int a, b;
void * c;
} k;
//init k...
struct b {
int u, w;
long *data;
} p = *(struct b*)&k;
是否会支持每个支持该标准的编译器?如果我反转强制转换(例如从struct b转换为struct a)c将与开头相同? 我很确定它适用于gcc(即使使用-ansi -pedantic),微软编译器等等,但它是否保证它是标准的c 89?
谢谢!
答案 0 :(得分:4)
不要这样做。手动复制字段:
struct b p;
p.u = k.a;
p.w = k.b;
p.data = (long *) k.c;
您的代码很可能会运行得很好,因为long *
和void *
通常会同样实现,但为什么会冒这个风险呢?标准说的是:
指向void的指针应具有与a相同的表示和对齐要求 指向字符类型的指针.39)同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有 指向结构类型的指针应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。指向其他类型的指针不需要具有相同的表示或对齐要求。
请注意最后一句,其中指向“其他类型”(例如long
)的指针与指向void
的指针不同。
以上是明确的,安全的,更清晰的。