struct casting ansi c 89

时间:2012-12-05 10:18:36

标签: c casting struct c89

在严格的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?

谢谢!

1 个答案:

答案 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的指针不同。

以上是明确的,安全的,更清晰的。