【问题标题】:C++ weird array behaviour [duplicate]C ++奇怪的数组行为[重复]
【发布时间】:2021-04-08 19:19:45
【问题描述】:

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

 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]

【问题讨论】:

  • 典型的缓冲区溢出问题。使用调试器逐句执行代码,同时监控所有变量的值。如果您将复杂的表达式分解为更简单的表达式(例如 count[arr[i]+1]++; 可以分解为 int temp = arr[i]; count[temp + 1]++;),这会有所帮助。
  • 作为提示,想想i 在第二个循环中可能有哪些值。那么i + 1 的索引是什么。
  • @Poseidon 我相信this compiler warning 很好地解释了正在发生的事情。调查为什么具有未定义行为的代码会表现得像这样是徒劳的。
  • @Someprogrammerdude 哦,谢谢我知道我在做傻事!!!!
  • 另外,我现在应该删除问题吗?我是新手!!!

标签: c++ arrays sorting for-loop counting


【解决方案1】:

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 的第一个元素,因为它在堆栈上的布局方式。但据我所知,任何事情都可能因此而发生。

【讨论】:

  • 知道了。谢谢你。 “任何事情都可能发生”部分是最可怕的,因为它可能根本不会影响程序(至少这是我所理解的),我会继续我的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多