C语言的内存问题

C语言的内存问题,c,memory,codeblocks,C,Memory,Codeblocks,你好,祝你有一个愉快的一天,我经过了几天的尝试和错误来到这里,所以请原谅我的愚蠢 我有以下代码。该代码的思想是首先读取我所有的文件,并将所有数据存储到矩阵NsitesxNxxNy,然后将数据用于其他不相关的事情 数据量不是很多,我的意思是我有800个数据文件,占用的空间不超过80MB,但无论如何,如果我尝试使用大于134的DataFiles数字,我会得到一个分段错误 我觉得这很奇怪,因为如果它能处理大量的DataFiles=100为什么它不能处理更高的数据 我认为这是因为我的程序没有为进程分配足

你好,祝你有一个愉快的一天,我经过了几天的尝试和错误来到这里,所以请原谅我的愚蠢

我有以下代码。该代码的思想是首先读取我所有的文件,并将所有数据存储到矩阵
Nsites
x
Nx
x
Ny
,然后将数据用于其他不相关的事情

数据量不是很多,我的意思是我有800个数据文件,占用的空间不超过80MB,但无论如何,如果我尝试使用大于134的
DataFiles
数字,我会得到一个分段错误

我觉得这很奇怪,因为如果它能处理大量的
DataFiles=100
为什么它不能处理更高的数据

我认为这是因为我的程序没有为进程分配足够的内存,或者是因为我在分配内存时遇到了问题。但是我总是有相同数量的数据,我的数据文件有精确的
88*44
值,并且只工作到134个文件它是。。。我没有“大量”数据/内存使用的经验,但我认为
1000*88*44
大约是
10^6
两位数,这并不太多

我正在使用GCC编译器和Ubuntu(我想是14.02),当我试图在Windows中使用代码块编译和执行这个程序时,它只是崩溃了(另一个错误)

哦,我还打开了一个终端,使用RAM内存,有134个文件,这对计算机来说没什么大不了的

编辑:我还尝试制作了几个
[100][Nx][Ny]
数组,并逐一使用它们,但这也导致了分段错误。 编辑2:次要勘误表文本和代码 而且,我遵循这种方式是因为我同时需要所有数据。。。我在想避免这种情况的新方法,但最近几天没有找到任何替代办法

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


const int   Nx=88;          //
const int   Ny=44;          //
const int   DataFiles=100;  // How many data files are we going to read 


int main() {
int i, j, ki , kj ,index;
double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];
FILE * conf;
char file[100];

for (index=0; index<DataFiles; index++){

    sprintf(file,"data//file%i00.txt",5000+index*25);
    conf=fopen(file,"r");

    for(ki=0;ki<Nx;ki++){
        for(kj=0;kj<Ny;kj++){

            fscanf(conf,"%i %i %lf", &i, &j, &fun[index][ki][kj]);
            mean[ki][kj] = mean[ki][kj] + fun[index][ki][kj] ;

    }}
fclose (conf);
}
// do things with my loaded data
}
#包括
#包括
#包括
#包括
常数int Nx=88//
常数int Ny=44//
常量int数据文件=100;//我们要读取多少数据文件
int main(){
int i,j,ki,kj,索引;
双重乐趣[DataFiles][Nx][Ny],Res[DataFiles][Nx][Ny],表示[Nx][Ny];
文件*conf;
字符文件[100];

对于(index=0;index您的堆栈已用完。一般来说,不要在堆栈上一次分配超过8k。Oops

改变

double fun[DataFiles][Nx][Ny], Res[DataFiles][Nx][Ny],mean[Nx][Ny];


您的两个数组
fun
Res
总共为6195200字节。在Linux上,默认堆栈为8MB。您正在将其剪切得非常近。您可能应该在完成读取后关闭文件。您没有检查
fopen
是否成功!您需要同时从内存中的所有文件中获取数据吗?使用数据f是否足够rom只是一个文件,或者可能是几个文件?StackOverflow的一个StackOverflow问题。循环:见迭代。迭代:见循环。如果我用纯复制粘贴尝试这段代码,它不会编译。它说
错误:可变大小的对象可能没有初始化。
。我会仔细看看,但我仍然不太了解malloc。还有我不明白为什么我不能这样做,但我很欣慰,非常感谢,真诚地。我仍然找不到如何使这个工作,我不能用
malloc
声明一个矩阵?@fdzglln:我必须自己查找它。结果是这个类型需要括号才能工作。
double (*fun)[Nx][Ny] = malloc(sizeof(fun[0]) * DataFiles), (*Res)[Nx][Ny] = malloc(sizeof(Res[0]) * DataFiles), mean[Nx][Ny];
if (!fun || !Res) {
    /* handle OOM */
}