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

C++数组超出范围访问计算指针有效?

沙柏
2023-03-14
int* arr = new int[2];
std::cout << &arr[0x100];

共有1个答案

伍昱
2023-03-14

在我的编译器(Cygwin GCC)中,以这个值获取地址与执行指针算术是相同的,尽管它们都是未定义行为(UB)。正如Jens在http://blog.llvm.org/2011/05/what-ever-c-programmer-show-know.html的评论中提到的,我发现以下内容很有帮助。

还值得指出的是,Clang和GCC都确定了C标准未定义的一些行为。根据标准,我将描述的东西都是未定义的,并且在它们的默认模式下,这两个编译器都将其视为未定义的行为。

取消野生指针和越界数组访问:取消随机指针(如NULL、指向空闲内存的指针等)和越界访问数组的特例是C应用程序中常见的bug,希望不需要解释。为了消除这种未定义行为的来源,必须对每个数组访问进行范围检查,并且必须更改ABI,以确保范围信息跟随在任何可能服从指针算术的指针周围。对于许多数值应用程序和其他应用程序来说,这将具有极高的成本,并且破坏了与每个现有C库的二进制兼容性。

    int* arr = new int[2];
    std::cout << arr << std::endl;
    std::cout << &(arr[0])<< std::endl;
    std::cout << &(arr[1])<< std::endl;
    std::cout << &arr[0x100] << std::endl; // UB, cannot be dereferenced
    std::cout << &arr[256] << std::endl;   // cannot be dereferenced, so no use in having it
    std::cout << arr + 0x100; // UB here too, no use in having this address 
0x60003ae50
0x60003ae50
0x60003ae54
0x60003b250
0x60003b250
0x60003b250
 类似资料:
  • 我在设置鹰派代理时遇到问题。我已经在 OpenShift 容器中设置了代理,当代理尝试调用在另一个容器中运行的另一个应用程序的 jolokia endpoint时,我收到此错误日志: 也许有人有类似的问题?代理的版本是Hawkular OpenShift Agent:版本:0.1.0。

  • 问题内容: 我正在使用FFmpeg为Windows平台编写一个应用程序,它是golang包装器goav,但是我在理解如何使用C指针获取对数组的访问方面遇到了麻烦。 我试图获取存储在AVFormatContext类中的流以供使用,并最终将帧添加到OpenGl中的纹理以使视频播放器具有出色的过渡效果。 我认为了解如何转换和访问C数据将使编码变得容易得多。 我已经删除了C代码的所有相关部分,包装程序和我

  • 问题内容: 我已经开始处理我的第一个Java程序,它是一个简单的计算器,但是我得到一个错误,声称我的数组超出范围。我尝试对其进行调试,以了解这样做的原因和原因,并遵循纸上的代码,两者均显示了我期望和期望的结果。因此,我看不到问题出在哪里。代码不完整。 根据调试器,此行出现错误: 这是我当前拥有的代码的主要部分: 这是我收到的错误消息: 问题答案: 当等于中的最后一个元素索引时,则将大于最后一个元素

  • 我正在创建一个宏,它将从一个更大的工作簿中选择工作表,移动和保存这些工作表作为一个新的工作簿,然后移动到下一个集。 我创建了一个带有开始和结束值(由工作表索引号指定)的伪“数组”。 我遇到了一个“下标超出范围”的错误,在完成保存文件的部分后,但在将拉出下一组工作表的循环之前。

  • 你好,stackoverflow的好人们!我有一个奇怪的问题,我不明白。我要发布我的两个有问题的方法: 另一个: 所以,我正在根据我在网上找到的一些代码制作一个数独解算器。现在,当我试着调试程序时,我可以很好地检查一些行(并且它按照预期工作),但是一旦程序第一次在方法“resi”中调用“next”方法,它就会崩溃,出现数组索引越界异常。如果我只是尝试在不进行调试的情况下运行该程序,那么在同一方法调

  • C++ 指针 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { cout << "Va