【发布时间】: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