simpe c ++代码中的分段错误

时间:2015-12-10 16:21:01

标签: c++ linux

我在GNU / linux /上使用code :: bocks 我知道什么是分段错误,只是好奇在这种情况下导致它的原因。 为什么它会返回分段错误:

#include <iostream>
int main()
{
    using namespace std;
    int tab1[3];
        tab1[0] = 2 + 7 * 16 - 8;
        tab1[1] = 22 * 2 / 11;
        tab1[2] = 8383 - 222 + 292 * 8;
        tab1[3] = 5 * 2 * 4;

    cout << " " << tab1[1];
    return 0;
}

而这不是

#include <iostream>
int main()
{
    using namespace std;
    int tab1[3];
        tab1[0] = 2 + 7 * 16 - 8;
        tab1[1] = 22 * 2 / 11;
        tab1[2] = 8383 - 222 + 292 * 8;
        tab1[3] = 5 * 2 * 4;

    cout << tab1[1];
    return 0;
}

3 个答案:

答案 0 :(得分:3)

您已声明数组tab1有3个元素的空间,但在代码中您将值分配给四个元素。 tab1[3] = 5 * 2 * 4;写入数组外的内存。一个程序段错误而另一个程序没有错误可能只是巧合。

答案 1 :(得分:1)

您尝试分配到数组范围之外的tab1[3]。这是未定义的行为并导致您的分段错误。

答案 2 :(得分:1)

您正在使用索引超出范围访问数组。

int tab1[3];
tab1[0] = 2 + 7 * 16 - 8;
tab1[1] = 22 * 2 / 11;
tab1[2] = 8383 - 222 + 292 * 8;
tab1[3] = 5 * 2 * 4;  // <-- Error

数组从索引0开始,然后转到n-1,其中n是数组中的项目总数。因此,对于其中包含2项的数组,最大索引为3

现在为什么会有不同的行为?访问数组越界是未定义的行为。您无法可靠地预测出现诸如越界访问等错误时会发生什么。

相关问题