【发布时间】:2015-02-10 14:40:36
【问题描述】:
我试图了解 C99 标准 (C99; ISO/IEC 9899:1999 6.5/7) 中以下语句的含义
对象的存储值只能由左值访问 具有以下类型 73) 或 88) 之一的表达式:
(省略其他与问题无关的陈述)
聚合或联合类型,包括上述之一 其成员之间的类型(包括,递归地,一个成员 子聚合或包含联合)
考虑以下几点:
typedef struct MyComplex {
float real;
float imag;
} MyComplex;
MyComplex *carray = malloc(sizeof(*carray) * 10);
float *as_floats = (float *)carray;
这是否合法,因为 MyComplex 结构包含与 as_floats 指针兼容的 float 类型?
反过来呢?即:
float *farray = malloc(sizeof(*farray) * 10);
MyComplex *as_complex = (MyComplex *)farray;
在这两种情况下,最终,我们在这里处理的所有内容都是float,所以也许没关系?我只是不确定。
我问,因为我正在处理一个遗留代码库,它在所有地方都做这种事情,到目前为止,一切似乎都很好。但我觉得我们在这里玩火。试图弄清楚我是否需要在编译器命令行上禁用严格别名。
【问题讨论】:
-
应该
MyComplex *carray = malloc(sizeof(*carray) * 10);是MyComplex *carray = malloc(sizeof(MyComplex) * 10);吗? -
不,它是等价的,除非
carray的类型发生变化时它不会中断。 -
我认为事情并不总是那么理想。事实上,在必要时添加填充对于实现是有好处的,因此这两种方式都可能导致读取/写入垃圾数据。
标签: c gcc standards c99 strict-aliasing