C++ 奇怪的数组行为

C++ weird array behaviour

我在调试我的关键索引计数代码时发现了这个问题。 我不明白这里发生了什么。我查看代码太久了,看我是否遗漏了一些非常明显的东西,但它看起来不像。

 int main()
{
    const int r=7,len=10;
    int arr[10]={1,4,6,2,0,4,3,6,5,2};
    int count[r+1]={0};
    for(int i=0;i<len;i++)
    {
        count[arr[i]+1]++;
    }
    cout<<arr[0]<<" ";

    for(int i=0;i<r+1;i++)
    {
        count[i+1]+=count[i];
    }
    cout<<arr[0]<<" ";
    return 0;
}

这是生成相同错误的模拟代码。

输出:-

1 11

我没有在程序的任何地方更改 arr 的值,但它仍然在输出中显示 11 而不是 1

如果我注释掉 count[arr[i]+1]++;count[i+1]+=count[i]; 或两者都会给出正确的输出。

1 1

请解释发生了什么。 (如果我做的事情很傻,请评论)。

编辑:这只发生在 arr[0]

使用 g++ -Wall -Wextra 编译它会收到此警告:

rando_so.cpp: In function 'int main()':
rando_so.cpp:15:19: warning: iteration 7 invokes undefined behavior [-Waggressive-loop-optimizations]
         count[i+1]+=count[i];
         ~~~~~~~~~~^~~~~~~~~~
rando_so.cpp:13:18: note: within this loop
     for(int i=0;i<r+1;i++)

这提示您仔细观察第二个循环。您的变量 i 上升到 count 的最高可能索引 - 然后您添加 1。这是未定义的行为。在您的情况下,由于它在堆栈上的布局方式,您现在很可能正在写入 arr 的第一个元素。但据我所知,任何事情 都可能因此而发生。