c - 将 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; // ??
解决方案
原始问题
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
是“在其成员中包含上述类型之一的聚合或联合类型”。因此,*c
、c->re
和c->im
应该是别名规则允许的访问。
C 标准也没有指定 的布局cmplx_t
让im
成员紧跟在re
成员之后。允许 C 实现在成员之间和结构末尾插入填充。但是,对于相同类型的成员,没有理由这样做,典型的 C 实现也不这样做。因此,在普通的 C 实现中,c->re
and应该访问数组c->im
的所需元素, and也应该如此。float
c[i].re
c[i].im
添加的问题
可以cmplx_t
通过float *
.
C 标准没有定义尝试这样做的行为。对于 type 的对象cmplx_t
,float
不是上面列出的任何类型。
推荐阅读
- excel - 当过滤器没有数据时跳过表的副本
- aws-api-gateway - 具有认知授权的 AWS API 网关
- android - 在ionic3中使用facebook插件时构建android apk时出错
- git - RunCloud 部署脚本与 Laravel Forge - 为什么使用 git merge 而不是 git pull?
- powershell - 从 PowerShell Get-ChildItem -match 中排除所有子目录
- javascript - javascript 中的 JRE Bit 版本
- javascript - 如何在表单提交之前更改文件的顺序 - Jquery / Javascript
- nuxt.js - 如何从数据库中提取数据并将其异步存储在NUXT中
- vue.js - iview ui 上传成功后如何清除文件?
- jquery - 打开/关闭时的图像变化