2015-06-17 50 views
-2

运行我的程序时出现了分段错误,并且出现了奇怪的结果。我已经投入了大量的调试代码来准确找到奇怪的行为。SIGSEGV,使用数组的分段错误

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

您正在访问界阵列OT。索引'int a [N]'从'a [0]开始,最大的索引是'a [N-1]'。 –

+0

随着想法的发展,也许学习语言(从书中)不会伤害.... –

回答

2

C++中的数组索引编号为0,而不是1。例如,在main中的任何访问a[x][3]都是超出界限的。

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

2

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

因此,

a[1][1]a[0][0],等等。

所以最后一个要素是a[2][2](3×3矩阵),不a[3][3]