我正在编写一个程序,其中采用 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/