首页 > 解决方案 > 将 C 浮点数组转换为浮点结构,反之亦然?

问题描述

typedef struct cmplx {
    float re;
    float im;
} cmplx_t;

可以将浮点数组安全地转换为这种复杂类型吗?

像这样:


float s[SIZE*2];

cmplx_t* c = (cmplx_t*) s; // ?? 

反之亦然,浮动指针的结构呢?


cmplx_t c[SIZE];

float* c = (float*) c; // ?? 

标签: c

解决方案


原始问题

float可以通过 a 访问数组cmplx_t *吗?

C 标准中的语言似乎允许这样做。首先,我们必须考虑将s自动转换为指针的 转换为cmplx_t *。只要对齐正确,C 2018 6.3.2.3 7 就部分定义了转换。标准不保证结构的对齐要求至多是其成员最严格的对齐要求,但这是典型的,所以转换是在普通的 C 实现中定义的。

然后我们必须考虑别名规则。C 2018 6.5 7 说:

对象的存储值只能由具有以下类型之一的左值表达式访问:

— 与对象的有效类型兼容的类型,

— 与对象的有效类型兼容的类型的限定版本,

— 与对象的有效类型相对应的有符号或无符号类型,

— 对应于对象有效类型的限定版本的有符号或无符号类型,

— 在其成员中包含上述类型之一的聚合或联合类型(递归地,包括子聚合或包含联合的成员),或

— 一种字符类型。

由于c指向被定义为float对象的内存,float是“与对象的有效类型兼容的类型”,并且*c是“在其成员中包含上述类型之一的聚合或联合类型”。因此,*cc->rec->im应该是别名规则允许的访问。

C 标准也没有指定 的布局cmplx_tim成员紧跟在re成员之后。允许 C 实现在成员之间和结构末尾插入填充。但是,对于相同类型的成员,没有理由这样做,典型的 C 实现也不这样做。因此,在普通的 C 实现中,c->reand应该访问数组c->im的所需元素, and也应该如此。floatc[i].rec[i].im

添加的问题

可以cmplx_t通过float *.

C 标准没有定义尝试这样做的行为。对于 type 的对象cmplx_tfloat不是上面列出的任何类型。


推荐阅读