Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 循环中数组的行为_C++ - Fatal编程技术网

C++ 循环中数组的行为

C++ 循环中数组的行为,c++,C++,我是这个论坛的新手,我想问一下,为什么我制作的这个数组的行为与我预期的不同 int main() { int array[8]={3,5,5,6,6,5,3,5}; for(int i=-1;i<=8;i+=2) { std::cout<<array[i+1]; } return 0; } intmain(){ int数组[8]={3,5,5,6,6,5,3,5}; 对于(int i=-1;i索引8(在包含7的情况下)超出了数

我是这个论坛的新手,我想问一下,为什么我制作的这个数组的行为与我预期的不同

int main() {
    int array[8]={3,5,5,6,6,5,3,5};
    for(int i=-1;i<=8;i+=2) {
        std::cout<<array[i+1];
    }

    return 0;
}
intmain(){
int数组[8]={3,5,5,6,6,5,3,5};

对于(int i=-1;i索引8(在包含7的情况下)超出了数组边界(0到7),因此程序将显示内存中驻留的内容(这是
未定义行为的情况,可能导致运行时错误).

索引
i+1
的值将为
0、2、4、6、8
,但当索引从
0
开始时,大小为
8
的数组的最后一个索引是
7
。因此,您访问数组时超出了其界限,这会导致未定义的行为。您可以通过更改循环来解决此问题:

for(int i = -1; i < 7 ;i += 2) {
    // as before...
}
for(int i=-1;i<7;i+=2){
//和以前一样。。。
}

在调试此类错误时,使用
-fsanize=address
编译或使用
valgrind
运行可执行文件非常有帮助。

您的数组有8个条目,位置如下:

array[8] = {3, 5, 5, 6, 6, 5, 3, 5}
            ^  ^  ^  ^  ^  ^  ^  ^
 (position) 0  1  2  3  4  5  6  7 

你的循环从
i=-1
开始,一直到
i,当你从数组外部访问时,你会得到未定义的行为。这意味着,任何事情都有可能发生,包括得到7的值。你期望发生什么?你的程序会表现出未定义的行为。因此,试图通过缺少d来找到意义所在是毫无意义的定义,没有。顺便说一句,这不是相关的,而是7是此时
i
变量的值。这可能就是为什么你看到7,在内存中
i
变量存储在数组之后。显然你不应该依赖它,你的程序行为只是没有定义。@john i expe如果超出范围,则ct显示典型显示。我不希望它显示7而不是内存地址或值。不是7。如果我将my的值更改为8,它将显示内存地址或值。恐怕我不确定“典型显示”是什么意思。但在任何情况下,未定义的行为就是它。您我们可以了解当您在您使用的计算机类型上编写的程序类型具有未定义的行为时通常会发生什么情况。但您的体验可能与其他人不同。您问题的唯一正确答案是,这是未定义的行为,期望任何特定情况发生是错误的。我喜欢该方案a“这实际上是在数组结束后读取内存中的任何内容”这太粗心了。行为是未定义的;就是这样。例如,一个实现可能会限制对最后一个元素的越界访问;特别是在指针没有衰减的情况下。@Bathsheba我同意任何事情都可能发生,但我认为很明显,这里发生的事情是一些额外的垃圾内存正在被占用阅读数组的末尾。我认为,对于提问者来说,描述他们为什么观察到自己的行为,而不是这个程序在抽象机器上运行的行为,会更有帮助。不过,你肯定是对的,我将进行编辑以使UB更清晰。在我们讨论时,我想指出这一点“并且程序的行为在之后变得未定义”是不正确的。整个程序的行为是未定义的(技术上没有“之后”)-编译器可以自由地假设这不会发生,所以可能会发生。是的,这不会发生在这里,但这是值得警惕的。@MaxLanghof这是一个很好的观点,谢谢。在我的脑海中,我把“在你写这个之后”和“在程序执行这个之后”混为一谈,但这不是一回事!我再次编辑了答案。”因此,程序向您显示内存中驻留的内容“这可能就是为什么没有向上投票的原因,正如您后来指出的那样,无法判断是否存在这种情况,行为是未定义的。