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
的第一个元素。但据我所知,任何事情 都可能因此而发生。
我在调试我的关键索引计数代码时发现了这个问题。 我不明白这里发生了什么。我查看代码太久了,看我是否遗漏了一些非常明显的东西,但它看起来不像。
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
的第一个元素。但据我所知,任何事情 都可能因此而发生。