0

struct 在严格的 c 89 中是否定义良好?我的意思是这段代码

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)、microsoft 编译器等,但它是否保证它是标准的 c 89?

谢谢!

4

1 回答 1

4

不要这样做。手动复制字段:

struct b p;

p.u = k.a;
p.w = k.b;
p.data = (long *) k.c;

你的代码很可能会运行得很好,因为long *并且通常void *会以相同的方式实现,但为什么要冒险呢?该标准说的是:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。39) 类似地,指向兼容类型的合格或非合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有彼此相同的表示和对齐要求。所有指向联合类型的指针都应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

请注意最后一句,其中指向“其他类型”(例如long)的指针与指向 的指针不同void

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

于 2012-12-05T10:21:52.257 回答