在Linux中使用128 gb ram在gcc中编译时分段失败[重复]

zfycwa2u  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(114)

此问题在此处已有答案

Segmentation fault on large array sizes(7个答案)
Getting a stack overflow exception when declaring a large array(8个答案)
9天前关闭。
我正在运行一个c代码,它需要一个大小为2000*2000的矩阵。我使用了malloc和直接分配。但在编译时,它会显示“分段失败(核心转储)"。我在Linux系统的终端上运行它,128 GB内存
第一个代码如下

#include<stdio.h>
int main(int argc,char ** argv){
  int N = 2000;
  int A[N][N];
}

字符串
第二个是

#include<stdio.h>
int main(int argc,char ** argv){
int i,j;
  int Nx = 2000;
  int Ny = 2000;
int npoint = Nx*Ny;
 double** A =(double**) malloc(npoint*sizeof(double));
for (j = 0;j< npoint;j =j+1){
    A[j] = (double*)malloc((npoint)*sizeof(double*));
    }
 for( j= 0;j<npoint;j++){
   for (i=0;i<npoint;i++){
    A[i][j]  = 0;
   }}
}


使用gcc进行编译,第一个直接显示分段失败(核心转储),但另一个启动,但在一段时间后被终止。

lp0sw83n

lp0sw83n1#

所以首先,你应该为指向大小为sizeof(double*)的Nx个指针的数组的指针分配内存。下一步,对于数组中的每个指针,您应该分配大小为Ny * sizeof(double)的内存。下面是它的代码。

#include<stdlib.h>

int main(int argc, char ** argv)
{
    int i,j;
    int Nx = 2000;
    int Ny = 2000;
    double** A = malloc(Nx * sizeof(double*));
    for (j = 0; j < Nx; j = j+1){
        A[j] = malloc(Ny * sizeof(double));
    }
    for(j = 0; j < Nx; j++)
        for (i=0; i < Ny; i++)
            A[i][j]  = 0;
}

字符串

相关问题