此代码运行不正常并在运行时显示以下错误:
检测到堆栈粉碎:./a.out终止了 中止(核心倾销)
但是,如果我们用i声明temp,那么j可行。如果我们在if块中声明temp,也会显示错误。如果我们明确声明数组大小,则不会显示错误。我正在使用GNU编译器编译我的代码。
#include<iostream>
using namespace std;
int main()
{
int i, j;
int a[] = {3, 2, 4, 1};
int temp;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4 - i; j++)
{
if(a[j] > a[j + 1])
{
int temp;
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(i = 0; i < 4; i++)
{
cout << a[i] << endl;
}
return 2;
}
答案 0 :(得分:2)
您的代码访问a[j+1]
。当j
为4时,会尝试访问超出范围的a[4]
; a
的大小为4,因此最后一个元素为a[3]
。
访问超出范围的数组索引是未定义的行为。它可能有效,也可能没有。
你说当你写这个时,你的程序不会崩溃:
int a[]={3,2,4,1};
int temp;
会发生这种情况,因为您的程序会为a
保留内存,并在此之后将temp
放入内存中。因此,当您尝试更改a[4]
的值时,实际上会更改temp
的值。
当您删除int temp;
时,您的程序似乎没有将其他变量放在与a[4]
对应的内存位置。它崩溃了,因为它无法访问该内存位置。