无论代码有多“糟糕”,并假设对齐等在编译器/平台上不是问题,这是否是未定义或损坏的行为?
如果我有这样的结构:-
struct data
{
int a, b, c;
};
struct data thing;
Is it legal访问a
, b
and c
as (&thing.a)[0]
, (&thing.a)[1]
, and (&thing.a)[2]
?
在每种情况下,在我尝试过的每个编译器和平台上,我尝试过的每个设置都“有效”。我只是担心编译器可能没有意识到这一点b and thing[1]是相同的东西,存储到“b”可能会被放入寄存器中,而 thing[1] 从内存中读取错误的值(例如)。在每一种情况下,我都尝试过,但它都做了正确的事情。 (我当然意识到这并不能证明什么)
这不是我的代码;这是我必须使用的代码,我感兴趣的是这是否是bad代码或broken代码的不同会影响我对其进行大量更改的优先级:)
标记为 C 和 C++ 。我主要对 C++ 感兴趣,但如果 C 不同的话,我也对 C 感兴趣,只是为了兴趣。
It is illegal 1. That's an Undefined behavior in C++.
您正在以数组方式获取成员,但这是 C++ 标准的规定(强调我的):
[dcl.array/1]:...数组类型的对象包含一个连续地分配的非空集合 N
T 类型的子对象...
但对于会员来说,没有这样的连续的要求:
[class.mem/17]:...;实施对齐要求可能会导致两个相邻的
成员不得紧接着分配...
虽然上面的两句话应该足以暗示为什么索引到struct
正如您所做的那样,这不是 C++ 标准定义的行为,让我们举一个例子:看一下表达式(&thing.a)[2]
- 关于下标运算符:
[expr.post //expr.sub/1]:后缀表达式后跟方括号中的表达式是
后缀表达式。表达式之一应是类型的左值
“T 的数组”或“指向 T 的指针”类型的纯右值,另一个应
是无作用域枚举或整型的纯右值。结果是
“T”型。类型“T”应是完全定义的对象类型。66表达方式E1[E2]
与(根据定义)相同((E1)+(E2))
深入研究上面引用的粗体文本:关于将整型类型添加到指针类型(请注意此处的重点)..
[expr.add/4]:当具有整型类型的表达式与一个表达式相加或相减时
指针,结果具有指针操作数的类型。If这
表达P
指向元素x[i]
of an array object x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)