代码显示错误***堆栈粉碎检测到***:./ a.out终止中止(核心转储)

时间:2016-04-13 16:52:39

标签: c++

此代码运行不正常并在运行时显示以下错误:

  检测到堆栈粉碎:./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;
}

1 个答案:

答案 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]对应的内存位置。它崩溃了,因为它无法访问该内存位置。