gpt4 book ai didi

c++ - 访问字符数组中不可用的内存位置(超出范围值)

转载 作者:行者123 更新时间:2023-12-03 12:49:46 30 4
gpt4 key购买 nike

我有一段代码:

#include <iostream>
using namespace std;

int main(){

char a[5][5] = {{'x','y','z','a','v'},{'d','g','h','v','x'}};

for(int i=0; i<2; i++){
for(int j = 0; j<6; j++)
{
cout << a[i][j];
}
}

return 0;

}

如您所见,第一维和第二维各为 5 个元素。使用双 for 循环,我只是打印变量 a 的初始化内容。

int“j”的大小随着它的增加输出会发生显着变化。

为什么会出现这种情况?

指针可以解决这个问题吗?如果是的话怎么办?如果不是,我们可以做些什么来避免由于这种不正确的访问而导致的运行时错误?

最佳答案

您可能会将此问题视为 Java 中的越界错误,其中行为是严格定义的:您将收到 ArrayIndexOutOfBoundsException ,并且程序将立即终止,除非异常被捕获并处理。

在 C++ 中,这种越界错误是未定义行为,这意味着编译器可以做任何它认为可以实现最佳性能的愚蠢事情。一般来说,这会导致编译器只是盲目地执行与界内数组访问相同的指针算术,而不管内存是否有效。

在您的情况下,因为您已经分配了 25 个字符的内存,所以您将至少在 i * 5 + 之前访问有效内存(在大多数环境中,可以承受 UB) j >= 25,此时可能发生任意数量的事情:

  • 您可以从堆栈中获取垃圾数据
  • 您可能会因段错误(Windows/Visual Studio 中的访问冲突)而导致程序崩溃
  • 循环可能会拒绝在您期望其终止的索引处终止。

最后一个是一个令人难以置信的错误:如果发生积极的循环优化,您可能会得到一些 very odd behavior当你在代码中犯这样的错误时。

您编写的代码中几乎可以肯定发生的是第一点:虽然您为 25 个字符分配了空间,但您只定义了其中 10 个字符的内容,这意味着除了第一个字符之外的任何访问10 将调用一种不同类型的未定义行为(访问未初始化的变量),在绝大多数情况下,这会导致它们的值被变量之前的内存空间中恰好存在的内容填充已被使用。

关于c++ - 访问字符数组中不可用的内存位置(超出范围值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43690780/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com