簡體   English   中英

SIGSEGV,使用數組的分段錯誤

[英]SIGSEGV, Segmentation fault using array

我在運行我的程序時遇到了分段錯誤並且得到了一個奇怪的結果。 我已經放入了很多調試代碼來准確找到奇怪行為的位置。

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;
}

段錯誤發生在程序錯誤發生后的調用程序的末尾。

有任何想法嗎?

C++ 中的數組從0索引,而不是1 例如,對main a[x][3]任何訪問都是越界的。

只需從所有索引中減去1編譯,但您應該閱讀C++ 介紹書,並了解循環和聚合初始化。

當您聲明一個大小為nXn的數組時,可能的索引是從 (0,0) 到 (n-1,n-1)。

所以,

a[1][1]應該是a[0][0] ,依此類推。

所以最后一個元素將是a[2][2] (對於 3 X 3 矩陣),而不是a[3][3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM