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

我有一个数组的并集。从一个数组读取一些元素,从另一个数组读取其他元素可以吗?[重复]

丘飞
2023-03-14

我有以下工会:

union PM_word {
    uint8_t  u8[8];
    uint16_t u16[4];
    uint32_t u32[2];
    uint64_t u64[1];
};

假设我初始化此并集的实例,如下所示:

PM_word word;
word.u32[0] = 0;
word.u16[2] = 1;
word.u8[6] = 2;
word.u8[7] = 3;

如果我理解正确,尝试读取word. u32[1]是未定义的行为,因为已设置的word. u16word. u8的元素与其重叠。但是,读取word. u32[0]也是未定义的行为吗?

编辑:如果C和C在这个问题上的语义学不同,关于C和C的答案非常感谢。

共有2个答案

何高歌
2023-03-14

我想说的是,这种行为不是没有定义的,只是不是你所期望的......因为 - 正如你所指出的 - 内存关闭,你不能一次使用(设置)所有。但是,例如同时使用单词.u8[0]单词.u8[1]单词.u16[1]会起作用。一旦你使用word.u64[0],所有其他变量都会改变。如果它们已损坏,则取决于值...

喻元龙
2023-03-14

相关C标准引用:

[类别联盟]

在联合中,如果非静态数据成员的名称引用了其生存期已经开始但尚未结束的对象([basic.life]),则该成员是活动的。联合类型的对象的非静态数据成员在任何时候最多只能有一个是活动的,也就是说,在任何时候,非静态数据成员的值最多只能存储在一个联合中。[...一个关于具有公共初始序列的类的特例,它不适用于这个例子,因为union没有类类型的成员...]

当赋值运算符的左操作数涉及指定联合成员的成员访问表达式 ([expr.ref]) 时,它可能会开始该联合成员的生存期,如下所述。对于表达式 E,定义 E 的子表达式的集合 S(E),如下所示:

>

  • 如果E的形式为A[B],并且被解释为内置数组下标运算符,则如果A为数组类型,S(E)为S(A),如果B为数组类型则为S(B),否则为空。

    […其他情况不相关,因为引用的情况适用…]

    在使用内置赋值运算符([expr.ass])或平凡赋值运算符([class.copy.assign])的形式为E1 = E2的赋值表达式中,对于S(E1)的每个元素X,如果X的修改在[basic.life]下具有未定义的行为,则在指定的存储中隐式创建X类型的对象;不执行初始化,在左操作数和右操作数的值计算之后、赋值之前,对其生命周期的开始进行排序。[注意:这将结束先前活动的联合成员的生存期(如果有)([basic.life])。—结束注释]

    这意味着在语句word. u8[6]=2;之后,只有word. u8成员处于活动状态,所有其他联合成员都处于非活动状态。在最后一条语句word. u8[7]=3;之后,只有word. u8[6]word. u8[7]具有初始化值。

    非活动成员的生命周期已经结束。以下是关于是否可以读取它们的值的相关规则:

    [basic.life]

    类似地,在对象的生存期开始之前,但在对象将占用的存储被分配之后,或者在对象的生命期结束之后,在对象占用的存储重新使用或释放之前,任何引用原始对象的glvalue都可以使用,但只能以有限的方式使用。。。在以下情况下,程序具有未定义的行为:

    • glvalue用于访问对象,或

    所以,是的。访问非活动成员将是UB(除非该访问是赋值,或者根据[class.union],在涉及公共初始类序列的特殊情况下除外)。

  •  类似资料:
    • 问题内容: 说我有这些二维数组A和B。 如何从B中删除A中的元素。(集合论中的补语:AB) 更准确地说,我想做这样的事情。 问题答案: 基于this solution对,这里是用更少的内存占用与NumPy基础的解决方案,并与大型阵列工作时,可能是有益的- 样品运行- 在大型阵列上的运行时测试- 具有基础解决方案的时间- 基于更少内存占用量的定时解决方案- 进一步提升性能 通过将每一行视为索引元组来

    • 问题内容: 我想了解 从另一个数组的所有元素过滤数组 的最佳方法。我尝试使用过滤器功能,但是如何给它提供要删除的值并没有解决。 就像是: 如果过滤器功能没有用,您将如何实现呢? 编辑:我检查了可能重复的问题,它可能对那些容易理解javascript的人有用。选中的答案很容易。 问题答案: 您可以使用函数的参数来避免将过滤器数组存储在全局变量中。

    • 我想了解从另一个数组的所有元素中筛选一个数组的最佳方法。我尝试了筛选函数,但我不知道如何给它我想要删除的值。 类似内容: 如果过滤器功能不是有用的,你将如何实现它? 编辑:我检查了可能重复的问题,对于那些容易理解javascript的人来说,它可能很有用。如果答案被检查为好,事情就会变得简单。

    • 问题内容: 我有一个数组: 我想获得此数组的第一个元素。预期结果: 字符串 一个要求: 它不能通过引用传递来完成 ,所以不是一个好的解决方案。 我怎样才能做到这一点? 问题答案: 原始答案,但代价昂贵(O(n)): 在O(1)中: 其他用例等 如果修改(就重置数组指针而言)不是问题,则可以使用: 如果需要数组“副本”,则从理论上讲应该更有效: 使用PHP 5.4+(但如果为空,则可能导致索引错误)

    • 如何从另一个数组中删除数组的元素?我有第一个数组[“a”“b”“c”]。以及第二阵列[“a”、“e”]、[“e”、“b”、“c”]、[“a”、“c”]。 如何从第二个数组中删除第一个数组的元素? 结果,得到[["e"],["e"], []].

    • 问题内容: 我很难弄清楚如何移动数组元素。例如,给出以下内容: 我为什么能写入移动功能之前? 还是之后? 移动后,应更新其余元素的索引。这意味着在第一个示例中,移动后arr [0] =’a’,arr [1] =’d’arr [2] =’b’,arr [3] =’c’,arr [4] = ‘e’ 这似乎应该很简单,但是我无法将其包裹住。 问题答案: 如果您想在npm上使用一个版本,则array-mo