【发布时间】:2015-12-30 19:00:05
【问题描述】:
我有这个结构:
typedef struct V2f {
float x, y; } V2f;
在我的机器(64 位 Lubuntu 15.10)上,我可以使用此功能毫无问题地扫描它:
#include <stdbool.h>
#include <stdio.h>
bool scan_struct_as_arr(void *dst, int n, size_t sz, char *format) {
for(int i = 0; i < n; ++i) {
if(!scanf(format, (char *) dst + i * sz)) {
fputs("Failed to scan struct as an array", stderr);
return false; } }
return true; }
这种行为在多大程度上是可移植的?为什么?
如果只使用大小为 4 或 8 的变量,是否可以信任此代码?
【问题讨论】:
-
安全还是便携?你的问题是什么?两个都?它们并不完全相同。不可移植的构造可以是完全安全的。 (这里安全,那里不安全。)
-
两者。它的安全性和便携性如何。
-
对齐是实现定义的,所以可能会有填充字节。
-
看起来像一个安全故障:传递未经检查的格式字符串,不使用
const限定符,依赖于特定的布局和字节序,疯狂地转换类型(自动类型检查有什么问题?)。如果某个同事给了我这样的代码,那就是认真讨论的时候了。 -
像
arm_neon.h中定义的向量类型具有明确定义的结构并且(我相信)对于这种使用是安全的,因为它与数组等价物具有明确定义的关系。我想这也应该是 gcc 矢量扩展的情况。
标签: c arrays pointers struct scanf