如何在C语言中为非常大的二维数组分配内存

如何在C语言中为非常大的二维数组分配内存,c,allocation,large-data,C,Allocation,Large Data,我有一个文件,有500万行和4列。像往常一样,我尝试以5百万乘4的数组读取数据 long M = 5000000; double *coordinates[M]; for (i = 0; i < M; i++){ coordinates[i] = (double *) calloc(3, sizeof(double)); } 长M=5000000; 双*坐标[M]; 对于(i=0;i

我有一个文件,有500万行和4列。像往常一样,我尝试以5百万乘4的数组读取数据

long M = 5000000;
double *coordinates[M];
for (i = 0; i < M; i++){
    coordinates[i] = (double *) calloc(3, sizeof(double));
}
长M=5000000;
双*坐标[M];
对于(i=0;i

但当我运行这段代码时,它有段错误。在网上搜索答案后,我知道这是因为堆栈没有那么多内存。有人建议,如果数组是一维的,则使用malloc在堆上分配内存。但我需要一个二维数组,我真的需要这么多的内存,我希望有人能帮我解决这个问题。非常感谢。

您试图在堆栈上声明该数组,而不是在堆上声明,这将导致堆栈溢出错误

试试下面的

double** coordinates = malloc( sizeof( double* ) * M );

您正试图在堆栈而不是堆上声明该数组,这将导致堆栈溢出错误

试试下面的

double** coordinates = malloc( sizeof( double* ) * M );
你可以改变

double *coordinates[M];

确保以后在程序中释放该内存

for (i = 0; i < M; i++){
    free(coordinates[i]);
}
free(coordinates);
(i=0;i{ 自由(坐标[i]); } 自由(坐标); 您可以更改

double *coordinates[M];

确保以后在程序中释放该内存

for (i = 0; i < M; i++){
    free(coordinates[i]);
}
free(coordinates);
(i=0;i{ 自由(坐标[i]); } 自由(坐标);
您真的需要额外的指针层吗

size_t M = 4321098;
double (*coordinates)[4] = calloc(M, sizeof *coordinates);

你完成了<代码>坐标[234329][3]=3.1415926535一切正常。

您真的需要额外的指针层吗

size_t M = 4321098;
double (*coordinates)[4] = calloc(M, sizeof *coordinates);

你完成了<代码>坐标[234329][3]=3.1415926535一切正常。

正如大家所说,问题是您试图在函数堆栈上分配该数组。。但是,如果在代码中将该数组定义为静态,该怎么办?(就像函数中的全局变量或静态变量?)它不必在每次调用函数时分配

这将避免调用malloc和calloc(代价是成为固定大小的数组而不是动态数组)

#包括
#包括
#定义行10000000
#定义cols4
双坐标[行][COLS];
int main(){
对于(int i=0;i
自动变量和静态变量之间的区别在于,自动变量存在于函数内部(可能在每次调用函数时都会分配这些变量,而静态变量永远保持其值,并且可能只分配一次)

差不多吧。我用的是C99,所以你可以用。。 c99

或gcc-std=c99

或CC=c99生成文件


此外,在Linux中(我认为在windows中也是如此)您可以

正如大家所说,问题是您试图在函数堆栈上分配该数组。。但是,如果在代码中将该数组定义为静态,该怎么办?(就像函数中的全局变量或静态变量?)它不必在每次调用函数时分配

这将避免调用malloc和calloc(代价是成为固定大小的数组而不是动态数组)

#包括
#包括
#定义行10000000
#定义cols4
双坐标[行][COLS];
int main(){
对于(int i=0;i
自动变量和静态变量之间的区别在于,自动变量存在于函数内部(可能在每次调用函数时都会分配这些变量,而静态变量永远保持其值,并且可能只分配一次)

差不多吧。我用的是C99,所以你可以用。。 c99

或gcc-std=c99

或CC=c99生成文件


另外,在Linux中(我认为在windows中也是如此),您可以

谢谢。它工作得很好。顺便说一句,既然malloc不能启动缓冲区,那么还有其他选择可以同时进行分配和启动吗?试试calloc!或者马洛克&然后呢memcpy@JinYan您可以使用
calloc(M,sizeof(*坐标))
分配内存并将其初始化为zero@simonc我懂了。非常感谢。它工作得很好。顺便说一句,既然malloc不能启动缓冲区,那么还有其他选择可以同时进行分配和启动吗?试试calloc!或者马洛克&然后呢memcpy@JinYan您可以使用
calloc(M,sizeof(*坐标))
分配内存并将其初始化为zero@simonc我懂了。非常感谢。您的
calloc()
呼叫不正确。另外,我喜欢这个答案。”FredLarson:我为JTILL修正了<代码> CaloC ,考虑一个投票(我刚刚给出了一个)。我想我也可以纠正它。向上投票。您的
calloc()
调用不正确。另外,我喜欢这个答案。”FredLarson:我为JTILL修正了<代码> CaloC ,考虑一个投票(我刚刚给出了一个)。我想我也可以纠正它。向上投票。