(C编程)将2个一维数组合并为1个多维数组时出现段错误

时间:2018-10-13 06:17:08

标签: c arrays matrix segmentation-fault

我正在编写一个程序,其中使用2个一维数组并以其最简化的形式Ax = b生成矩阵。 函数的此部分包含数组A和b。 A是A [n * n],b是b [n]。在本节中,我尝试将两个数组组合在一起,使其看起来像一个实际的矩阵。 该代码有效,但是,如果n大于1023,则在调用main函数时会导致分段错误。我想知道这样做是否有更好的方法。当我尝试使用GDB调试器时,它停在了Y[i][j] = A[k];行,因此我认为这是需要修复的问题

int linsolve ( int n, double A[], double b[], double x []) {

    double Y[n][n+1];        //Creating multidimensional matrix 
    int k = 0;
    // Turns the two one dimensional array into one multidimensional 
    for (int i=0; i < n; i++){        //iterating row
        for (int j=0; j < n; j++){    // per column 

            Y[i][j] = A[k];                // adding from array A to Y 
            k++;
        }
        Y[i][n] = b[i];                 // adding from Array b to Y 
    }

2 个答案:

答案 0 :(得分:0)

// Assuming A has n * n elements
int linsolve ( int n, double A[], double b[], double x []) {
    double **Y = new double *[n];
    for (int i = 0; i < n; i++) {
        Y[i] = new double[n + 1];
    }
    int k = 0;
    // Turns the two one dimensional array into one multidimensional 
    for (int i=0; i < n; i++){        //iterating row

        for (int j=0; j < n; j++){    // per column 
            Y[i][j] = A[k++];                // adding from array A to Y 
        }
        Y[i][n] = b[i];                 // adding from Array b to Y 
    }
    // Do something
    // Free up Y before returning
    for(int i = 0; i < n; i++) {
        delete [] Y[i];
    }
    delete [] Y;
    //Return int here
}

答案 1 :(得分:0)

我假设您使用的是Unix / Linux类型的系统。首先输入以下内容找出堆栈大小

Question.prototype.displayQuestion = function() { // lines of code
};

这是堆栈大小(以千字节为单位)。在我的系统上是8Mb。如果您使用1200x1200矩阵,则需要

ulimit -s

这就是程序分段的原因。您正在8Mb堆栈上创建10Mb阵列。问题是,A或b是否也存在于堆栈中?您可能会收到segv,因为要传递的项目是在堆栈上创建的,并且大于分配的堆栈。

要解决此问题,请按照@shirish的建议在堆上创建数组。 @shirish的技术的替代方法是

1200x1201x8 appx 10Mb