SIGSEGV,使用数组进行分段故障

时间:2015-06-17 11:06:29

标签: c++

我在运行程序时遇到了分段错误,并且得到了一个奇怪的结果。我已经放了很多调试代码来找到奇怪行为的确切位置。

int det_2b2(int d[2][2])
{
    cout<<d[1][1]<<","<<d[1][2]<<endl;
    cout<<d[2][1]<<","<<d[2][2]<<endl;
    cout<<(d[1][1]*d[2][2]-d[1][2]*d[2][1])<<endl;
     return (d[1][1]*d[2][2]-d[1][2]*d[2][1]);
}

int det_3b3(int d3[3][3])
{
    int r1;
    int x[2][2];
    x[1][1]=d3[2][2];
    x[1][2]=d3[2][3];
    x[2][1]=d3[3][2];
    x[2][2]=d3[3][3];
    cout<<"r1.1="<<det_2b2(x)<<endl;
    r1=det_2b2(x);
    cout<<"r1.2="<<r1<<endl;
    x[1][1]=d3[2][1];
    x[2][2]=35;
    cout<<"r1.3="<<r1<<endl;
    x[1][2]=d3[2][3];
    cout<<"r1.4="<<r1<<endl;
    x[2][1]=d3[3][1];
    cout<<"r1.5="<<r1<<endl;
    x[2][2]=d3[3][3];
    cout<<"r1.6="<<r1<<endl;
    int r2=det_2b2(x);
    x[1][1]=d3[2][1];
    x[1][2]=d3[2][2];
    x[2][1]=d3[3][1];
    x[2][2]=d3[3][2];
    int r3=det_2b2(x);
    cout<<r1<<endl;
    cout<<d3[1][1]<<endl;
    cout<<r1*d3[1][1]<<endl;
    cout<<r2*d3[1][2]<<endl;
    cout<<r3*d3[1][3]<<endl;
    return r1*d3[1][1]-r2*d3[1][2]+r3*d3[1][3];
}

当我设置x [2] [2] = 35或x [2] [2] = d [3] [3]的值时,它将r1的值更改为35或更改为d [3]中的值] [3]因此,封面下肯定存在问题。调用程序是

#include <iostream>
#include "utilities.h"

using namespace std;

int main()
{
    int a[3][3];
    a[1][1] =   1;
    a[1][2] =   2;
    a[1][3] =   3;
    a[2][1] =   4;
    a[2][2] =   5;
    a[2][3] =   6;
    a[3][1] =   7;
    a[3][2] =   8;
    a[3][3] =   9;
    cout << "DET a= " << det_3b3(a)<<endl;
    return 0;
}

分段错误发生在程序错误发生后的调用程序结束时。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

C ++中的数组是从0索引而不是1。例如,a[x][3]中对main的任何访问权限都超出范围。

只需从所有索引中减去1,它应该编译,但你应该阅读introductory C++ book,并了解循环和聚合初始化。

答案 1 :(得分:2)

当你声明一个大小为nXn的数组时,可能的索引是从(0,0)到(n-1,n-1)。

因此,

a[1][1]应为a[0][0],依此类推。

所以最后一个元素是a[2][2](对于3 X 3矩阵),而不是a[3][3]