我有这样的结构:
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的变量,是否可以信任此代码?
发布于 2015-12-30 19:20:48
一般来说,这是不安全的,也不便于携带:
C.11 6.7.2.1结构和联合说明
给定的实现可能决定,对于结构,其他每个浮点数都应该与前一个浮点数相距16位,而对于数组,则是连续的。
更可移植的解决方案是将地址作为数组或变量参数传入:
bool scan_addr_array (void *addrs[], size_t N, const char *fmt);
bool scan_addr_va (const char *fmt, ... /* NULL terminated */);发布于 2015-12-30 19:07:40
不安全,不可移植:从struct V2f *到void *然后到char *的转换会调用未定义的行为。
https://stackoverflow.com/questions/34535523
复制相似问题