为啥我没有得到数组超出范围错误? [复制]
Posted
技术标签:
【中文标题】为啥我没有得到数组超出范围错误? [复制]【英文标题】:Why I am not getting array out of range error? [duplicate]为什么我没有得到数组超出范围错误? [复制] 【发布时间】:2021-10-15 12:03:09 【问题描述】:我的理解有问题。为什么这段代码有效? 我现在希望得到一个超出范围的错误。
int testArray[2][2];
testArray[0][0] = 1;
testArray[0][1] = 1;
testArray[1][0] = 1;
testArray[1][1] = 1;
testArray[1][5] = 5;
std::cout << testArray[1][5];
我正在使用 Visual Studio 2019。我收到警告,但在控制台上仍显示正确的值。
【问题讨论】:
这是undefined behavior 的一个很好的例子。仅仅因为您的程序不会发生崩溃...... 不 意味着它是“正确的”。也不意味着它不会在不同的时间、不同的地方或不同的平台上崩溃。或者可能会发生其他“坏事”——在最坏的情况下,你可能仍然幸福地没有意识到这些事情!示例:假设您在“testArray[]”之后声明了一个变量。您可能刚刚删除了该变量。还:像 C# 或 Java 之类的“托管语言”MIGHT 会给出“超出范围”错误。 【参考方案1】:你的程序的行为是undefined!
为什么这段代码有效?
您正在访问不存在的元素。这只是out of bounds, undefined behavior。任何事情都可能发生,它可能会或可能不会打印值,但您不应该对其进行中继。
如果您使用了较新的编译器,它会对此产生一些影响。比如clang 12.给了我一个明确的提示:https://gcc.godbolt.org/z/oar8hqYeb
source > :13 : 5 : warning : array index 5 is past the end of the array(which contains 2 elements)[-Warray - bounds]
testArray[1][5] = 5;
^ ~
gcc 11.1 与 -fsanitize=address,undefined
flags even tells you what's wrong:
/app/example.cpp:13:19: runtime error: index 5 out of bounds for type 'int [2]'
/app/example.cpp:13:21: runtime error: store to address 0x7ffdcf50a04c with insufficient space for an object of type 'int'
0x7ffdcf50a04c: note: pointer points here
.....
因此,请始终注意此类未定义的行为情况并编写更好的代码以供您参考!
【讨论】:
初学者要清楚:始终避免未定义的行为。这很糟糕。【参考方案2】:C++ 并没有真正检查您尝试访问的索引是否超出范围。编译后,数组实际上只是指向数组第一个元素的指针。访问是通过获取指向第一个元素的指针,添加所需的索引作为地址偏移量,然后在结果地址读取/写入数据。
在这种情况下,testArray[1][5] = 5;
会将堆栈上的 something 更改为 5。这取决于执行时内存中的数组紧随其后的内容。
顺便说一句,这称为缓冲区溢出错误,这是一个常见的安全问题。在 C++ 中,您有义务确保数组索引永远不会超出其范围。否则可能会导致意外行为、程序崩溃或更糟,导致远程代码执行安全问题。
【讨论】:
以上是关于为啥我没有得到数组超出范围错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?
从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定
线程 1:致命错误:索引超出范围。没有快速从数组中获取值,控制台显示它们不是空数组