对结构进行索引合法吗?

2023-11-27

无论代码有多“糟糕”,并假设对齐等在编译器/平台上不是问题,这是否是未定义或损坏的行为?

如果我有这样的结构:-

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(使用前将#替换为@)

对结构进行索引合法吗? 的相关文章

随机推荐

  • 添加包含数字列的分箱值的列

    我有一个包含几列的数据框 其中一列是排名 是 1 到 20 之间的整数 我想创建另一列 其中包含 bin 值 如 1 4 5 10 11 15 16 20 最有效的方法是什么 我的数据框看起来像这样 csv 格式 rank name inf
  • 了解 WebElement.findElement() 和 XPATH

    我想使用WebElement findElement 使用 XPATH 定位父节点内节点的 API span class child class 我以为这会让我归还 div 那是在父级内部 然而 它返回了我在整个 DOM 树中找到的第一个
  • Flask 文件上传限制

    我有一个用于多个文件上传的文件上传处理程序 并设置了 MAX CONTENT SIZE 文档提到当总文件大小超过限制时 Flask 会抛出 413 异常 因此我还使用自定义 413 页面编写了 413 错误处理程序 但是 在测试文件上传时
  • Gettext 或数据库翻译

    哪个更好 gettext 基于自定义MySQL 缓存的功能 Gettext 是一种内置功能 因此我认为它已针对性能进行了调整 使用 poedit 是一种痛苦 而且不可能向任何客户展示 自定义功能允许简单的翻译界面 但可能对 php db 使
  • 在 ReactJS 中删除一个项目

    我是 React 新手 制作了一个允许保存搜索的应用程序 这将拉取 JSON 但当前正在从静态数组中拉取data 我无法从搜索列表中删除搜索 这是 jsbin http jsbin com nobiqi edit js 输出 这是我的删除按
  • 使用来自多个模块的 python 日志记录写入文件和 RotatingFileHandler

    我正在使用以下模块来记录模块中的事件 我这样称呼它 module 1 from tools debug logger import debug logger self logger debug logger start logger mod
  • 升级 numpy 失败并出现“权限被拒绝”错误

    我下载了一个预编译的numpy二进制来自http www lfd uci edu gohlke pythonlibs numpy并尝试升级我当前的numpy在 Windows 7 上安装 pip install upgrade numpy
  • 让 Android 应用程序带有后退按钮

    我希望我的 Android 应用程序的用户在某个活动按回时离开我的应用程序 这可以做到吗 一个好方法是等待第二次回来 private boolean doubleBackToExitPressedOnce false Override pu
  • 具有重复键的 data.table 上的滚动联接

    我试图理解rolling joins in data table 最后给出了重现这一点的数据 给定给定时间机场交易的数据表 gt dt t id airport thisTime 1 1 a 5 1 2 3 a 5 1 3 2 a 6 2
  • Makefile.am 创建空目录

    使用自动工具 我需要在键入 make install 时创建一个空目录树 例如 etc myprg foo 现在 我通过指定空目标来做到这一点 如下所示 myprgdir sysconfdir myprg myprgfoodir sysco
  • jQuery ContextMenu 事件在 IOS 8.2 中不起作用

    我在 html 示例中使用 contextMenu 事件 当我长按 DIV 时它将被触发 但现在它不起作用 最新的 IOS 8 2 版本中有什么问题吗 这是示例代码
  • java中如何将包含逗号的数字字符串解析为整数?

    我越来越NumberFormatException当我尝试解析 265 858 时Integer parseInt 有什么方法可以将其解析为整数吗 这个逗号是小数点分隔符还是这两个数字 在第一种情况下 您必须提供Locale to Numb
  • 如何设置ListView项目的突出显示颜色?

    我必须为 ListView 项目制作另一种突出显示颜色 我对项目使用自定义适配器 并且我有以下代码 Layout
  • LSD 能否从检测到的循环的下一次迭代中发出 uOP?

    我正在研究 Haswell 端口 0 上的分支单元的功能 从一个非常简单的循环开始 BITS 64 GLOBAL start SECTION text start mov ecx 10000000 loop dec ecx jz end 1
  • Visual Studio 2017 出现 CUDA 9 不受支持的错误

    我最近更新了 VS 2017 现在我什至无法构建默认的 CUDA 项目 带有向量加法的项目 我怀疑这是由于以下错误造成的 Severity Code Description Project File Line Suppression Sta
  • Matplotlib 中的 bin 大小(直方图)

    我正在使用 matplotlib 制作直方图 有没有办法手动设置垃圾箱的大小而不是垃圾箱的数量 实际上 这很简单 您可以提供带有垃圾箱边界的列表 而不是垃圾箱的数量 它们也可能分布不均 plt hist data bins 0 10 20
  • 没有 malloc 或 calloc 的 free() 函数

    快速提问 您可以使用 free 函数而无需事先调用 malloc 吗 ei void someFunc void char str 6 Hello some processing here free str 我没有遇到编译错误 但是这有效还
  • 将广播接收器包装到 Flow(协程)中

    我有一个用于 wifi 扫描结果的广播接收器作为数据源 我想以协程方式制作它 我在这里找到了暂停功能的答案 https stackoverflow com a 53520496 5938671 suspend fun getCurrentS
  • 没有行开始和结束终止符的 Regex.Replace 会产生一些非常奇怪的效果......这里发生了什么?

    在回答这个问题的时候C 正则表达式 替换 和 有人提出了问题为何存在的问题 玩的时候我生成了以下代码 string s Regex Replace A w B Console Write s 这有输出 B BB B 我发现 0 长度的字符串
  • 对结构进行索引合法吗?

    无论代码有多 糟糕 并假设对齐等在编译器 平台上不是问题 这是否是未定义或损坏的行为 如果我有这样的结构 struct data int a b c struct data thing Is it legal访问a b and c as t