首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扫描与数组类型相同的N个成员的结构安全吗?

扫描与数组类型相同的N个成员的结构安全吗?
EN

Stack Overflow用户
提问于 2015-12-30 19:00:05
回答 2查看 66关注 0票数 2

我有这样的结构:

代码语言:javascript
复制
typedef struct V2f {
    float x, y; } V2f;

在我的机器(64位Lubuntu 15.10)上,我可以使用这个函数来扫描它,没有任何问题:

代码语言:javascript
复制
#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的变量,是否可以信任此代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-30 19:20:48

一般来说,这是不安全的,也不便于携带:

C.11 6.7.2.1结构和联合说明

  1. 结构或联合对象的每个非位字段成员以适合其类型的实现定义方式对齐。
  2. 在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址。..。在structure对象中可能有未命名的填充,但在开始时没有。

给定的实现可能决定,对于结构,其他每个浮点数都应该与前一个浮点数相距16位,而对于数组,则是连续的。

更可移植的解决方案是将地址作为数组或变量参数传入:

代码语言:javascript
复制
bool scan_addr_array (void *addrs[], size_t N, const char *fmt);
bool scan_addr_va (const char *fmt, ... /* NULL terminated */);
票数 3
EN

Stack Overflow用户

发布于 2015-12-30 19:07:40

不安全,不可移植:从struct V2f *void *然后到char *的转换会调用未定义的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34535523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档