2014-09-26 110 views
0

我运行在程序的问题,我不知道如何解决它。我正在处理一个文件,为此我使用ftell获得大小并将其存储在M_size中。之后,我用N声明一个无符号的char指针数组。然后在两个函数a()和b()中使用该数组。C中的分段错误,同时声明大指针数组

... 
unsigned long N = (M_size/ x); 
int LstElemSize = M_size % x; 
if(LstElemSize != 0){ 
    N += 1; 
}  
unsigned char *ptr_M[N] 
a(ptr_M) 
b(ptr_M) 
... 

函数A()实际上初始化ptr_M的每个元件在一个for循环:

a(){ 
    int i; 
    for(i = 0; i < N-1; i ++){ 
    ptr_M[i] = malloc(sizeof(unsigned char) * x); 
    } 
} 

函数B()迭代然后在每个元件,并且计算的东西,并在端部的每个元素被释放。

我现在的问题是,当我尝试处理文件例如1 GB的数组大小将在4 000 000左右,并出现分段错误(在我声明我的数组)。如果我正确计算出它是8字节(字符指针)乘以4 000 000 = 32 MB。运行该程序的服务器有足够的内存来保存该文件,但我想Response 1中提到的堆栈空间不够。

我能做些什么来解决我的问题?增加我的堆栈空间?谢谢!

+0

你试图在堆栈上创建一个32MB的数组?堆栈通常在单位数字的MB范围内,在使用VC++的Windows上,默认值仅为1MB。 – 2014-09-26 18:23:26

回答

1

问题是,您正在定义ptr_M在堆栈中,它有一个小尺寸的限制。堆没有这么小的尺寸限制,并且能够使用更多的系统内存。就像分配子数组一样,您需要使用malloc()来分配ptr_M。 (请务必在某些时候也伴随着所有这些子阵中解放出来!)

unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N); 

此外,您的a()有一个差一错误。它忽略数组的最后一项。使用这个:

for(i = 0; i < N; i ++){ 
+1

你对错过的错误是正确的,但实际上我正在做最后一个元素的其他事情。但没有任何背景,你是绝对正确的! – 2014-09-26 22:56:14

0

malloc从堆中分配空间,而不是从堆栈分配空间。你可以尝试增加你的堆看看编译器选项。检查那里支持的heapsize的上限。

0

unsigned char *ptr_M[N]variable-length array声明N号码unsigned char在你的情况下栈上。您应该动态分配数组的空间。

unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N); 
a(ptr_M); 
b(ptr_M); 
... 
//After you free each element in ptr_M 
free(ptr_M); 
+0

对于免费提示,我也会赞成这一点,但我不能。希望别人能做到!谢谢! – 2014-09-26 22:57:32