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

标签 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 
    }

最佳答案

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

ulimit -s

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

1200x1201x8 appx 10Mb

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

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

int linsolve ( int n, double A[], double b[], double x []) {
    double **Y = new double *[n];
    double *Ybody = new double[n * (n + 1)];
    for (int i = 0; i < n; i++) {
        Y[i] = &Ybody[i * (n + 1)];
    }

    // Turns the two one dimensional array into one multidimensional 
    int k = 0
    for (int i=0; i < n; i++){
        for (int j=0; j < n; j++){
            Y[i][j] = A[k++]; 
        }
        Y[i][n] = b[i];
    }

    // Do something

    // Free up Y before returning
    delete [] Y;
    delete [] Ybody;
}

关于c - (C 编程)将 2 个一维数组合并为 1 个多维数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52790094/

相关文章:

C编程为什么char数组的地址从0012FF74递增到0012FF75?

python - 检查列表中的值是否位于 numpy 数组的相应行中

c++ - 密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

PHP 将字符串矩阵转换为多维数组

c - 二维字符数组中的排序列

C 错误 C2040?字符 *( )' differs in levels of indirection from ' int ()'

c - ERANGE 和 EOVERFLOW 之间的语义区别是什么?

c++ - 交叉编译错误 "arm-none-eabi-g++ cannot find entry symbol"

java - 带有数组的嵌套for循环java

javascript - 尝试从 javascript/JQuery 数组中删除项目