我遇到程序问题,我不知道如何解决它。我正在处理一个文件并且这样做我用ftell获取大小并将其存储在M_size中。之后,我用N声明一个unsigned char指针数组。然后在两个函数a()和b()中使用该数组。
...
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()实际上在for循环中初始化ptr_M的每个元素:
a(){
int i;
for(i = 0; i < N-1; i ++){
ptr_M[i] = malloc(sizeof(unsigned char) * x);
}
}
函数b()遍历每个元素并计算东西,最后释放每个元素。
我的问题是,当我尝试处理文件时,例如1 GB的数组大小约为4 000 000,并发生分段错误(在行i中声明我的数组)。如果我正确计算它是8字节(字符指针)乘以4 000 000 = 32MB。运行程序的服务器有足够的内存来保存文件,但我想如Response 1中提到的那样,堆栈空间不够。
我可以做些什么来解决我的问题?增加我的堆栈空间?谢谢!
答案 0 :(得分:1)
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);
。您也应该为数组动态分配空间。
{{1}}
答案 1 :(得分:1)
问题在于您在堆栈中定义了ptr_M,它具有较小的大小限制。堆没有如此小的大小限制,并且能够使用更多的系统内存。您需要使用malloc()来分配ptr_M,就像分配子数组一样。 (确保在某些时候也将它与所有这些子阵列一起释放!)
unsigned char **ptr_M = malloc(sizeof(unsigned char*) * N);
此外,您的a()
还有一个错误。它忽略了数组的最后一项。使用此:
for(i = 0; i < N; i ++){
答案 2 :(得分:0)
malloc从堆中分配空间,而不是从堆栈中分配空间。你可以尝试增加你的heapsize看编译器选项。检查那里支持的堆大小的上限。