RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 795463
Accepted
wololo
wololo
Asked:2020-03-09 04:42:26 +0000 UTC2020-03-09 04:42:26 +0000 UTC 2020-03-09 04:42:26 +0000 UTC

溢出二维数组的子数组

  • 772

根据C++ 语言标准[expr.add], 7.6.6/4,如果我们有一个指向某个元素数组p的i第-个元素的指针n,并且有一个整数值j,那么该指针p + j指向i + j-th 元素 if if 0 <= i + j <= n; 否则,程序的行为是未定义的。

所以下面代码的行为是未定义的:

int arr[2];
int *pi = arr + 3; //UB

但是,如果我们“超越”二维数组的子数组会发生什么?例子:

int arr[2][2];
int (*p)[2] = arr;
int *pi = *p;
pi = pi + 3; //UB?

指针p指向数组的第一个元素arr,即 到类型为 的两个元素的数组int。指针pi指向类型为 的两个元素组成的数组的第一个元素int。在表达式中,尽管我们仍在数组内部,但pi + 3我们走出了两个 type 元素的数组。intarr

问题 1.pi + 3从语言标准的角度来看,表达是否是未定义的行为?

问题 2. 以下代码是否正确:

int arr2[1];
int *pi2 = arr2 + 1;
*pi2; //OK?

我对字符串感兴趣*pi2;。

c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    HolyBlackCat
    2020-08-09T22:39:43Z2020-08-09T22:39:43Z

    考虑到 (1),标准明确指出这是未定义的行为。

    子数组在内存中是连续的这一事实意味着这很可能在实践中起作用,但这仍然是未定义的行为。

    关于第 (2) 种情况尚不完全清楚,但无论如何最好不要这样做。

    这里建议这种取消引用与取消引用空指针具有相同的状态。关于这一点,如果不使用结果或仅从中获取地址,是否允许也不清楚。

    • 3
  2. AR Hovsepyan
    2020-03-09T06:01:04Z2020-03-09T06:01:04Z

    一个二维数组就是2个数组合一,也就是一个序列。

    对于数组int arr[2][2],arr[0] 是指向第一个元素的指针。数组本身有4元素,所以

     int* p = arr[0];
      p += 3;
    

    很正常,因为它p指向第四个元素

    • 1
  3. Mikhailo
    2020-03-09T05:03:40Z2020-03-09T05:03:40Z

    问题 2 - 不。数组中只有 1 个元素。

    问题 1 - 数组是一块分配的,就像它是一个普通的指针一样。

    只有你一开始就错了:0 <= i + j <= n. n对于元素数组0 <= i + j < n。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5