C ++奇怪的数组行为

海神波塞

我正在调试用于键索引计数的代码,但发现了此问题。我不明白这里发生了什么。我已经看了很长时间的代码,以查看是否遗漏了一些非常明显的东西,但看起来却并非如此。

 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由于它在堆栈中的布局方式,很可能您正在写入现在的第一个元素但是据我所知,由此可能会发生任何事情。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章