当前位置: 首页 > 知识库问答 >
问题:

通过索引和未定义的行为访问C struct成员[重复]

楚煜
2023-03-14

例如,我们希望通过索引访问C结构的成员。可以使用联合体方便地实现:

#include <iostream>

struct VehicleState
{
    struct State
    {
        double x, y, v, yaw;
    };

    union
    {
        State st;
        double arr[4];
    };
};


int main()
{
    VehicleState state;
    state.st.x = 1;
    state.st.y = 2;
    state.st.v = 3;
    state.st.yaw = 4;
    for (auto value : state.arr)
        std::cout << value << std::endl;
}

不幸的是,从不是最近写入的联合成员中读取是未定义的行为。也就是说,我还没有发现任何编译器或平台不能像预期的那样工作。你能告诉我称之为未定义行为而不是将其标准化的基本原理是什么吗?

共有1个答案

夏侯航
2023-03-14

事实上,从你写的工会成员之外的其他成员那里阅读是完全可以的,只要你只访问一个共同的前缀。所以

union {
    State st;
    struct {
        double x;
    };
} state;

state.st.x = 1;
if (state.x == 1) // perfectly fine.

问题是结构布局的规则很复杂,并且有很多实现定义。具有4个双精度的结构可能出于某种原因在双精度之间填充,然后您的双精度数组将无法访问相同的字节。

除非标准开始强制填充,或者描述什么时候填充必须相等,工会才能像你要求的那样工作,否则这是不允许的。

我推荐看命名tupples

 类似资料:
  • 我的印象是,访问除最后一个集合之外的成员是UB,但我似乎找不到一个可靠的引用(除了声称它是UB但没有任何标准支持的答案)。 那么,它是未定义的行为吗?

  • 我想打印第二个索引值,即SUMMER。 怎么才能实现呢?

  • 我被卡住了一段时间,无法弄清楚如何修复此代码

  • 问题内容: 当我尝试在其他PHP服务器上运行脚本时,出现了一个新问题。 在我的旧服务器上,即使未声明任何参数,以下代码也可以正常工作。 但是现在,在本地计算机(XAMPP-Apache)上的本地服务器上,如果未定义for的值,则会出现以下错误。 如果为声明了值,但脚本要调用某些javascript函数会发生什么,但是如果未声明任何内容,我希望页面能够正常加载。 你能帮助我吗? 问题答案: 错误报告

  • 问题内容: 可以说我有以下代码: 有没有一种方法可以以编号方式访问项目,例如: 问题答案: 如果是,则可以通过获取(key,value)对的元组的索引来轻松访问元素,如下所示 Python 3.X的注意事项 将返回一个可迭代的dict视图对象而不是一个列表。我们需要将调用包装到一个列表上,以使建立索引成为可能

  • 我正在运行一个PHP脚本,并继续收到如下错误: 注意:第10行C:\wamp\www\myPath\index.php中未定义的变量:my_variable_name 注意:第11行未定义索引:my_index C:\wamp\www\myPath\index.php 第10行和第11行如下所示: 这些错误信息的含义是什么? 为什么他们突然出现?我曾经使用这个脚本多年,我从来没有遇到过任何问题。