声明大指针数组时C中的分段错误

时间:2014-09-26 18:19:26

标签: c segmentation-fault stack-overflow large-files

我遇到程序问题,我不知道如何解决它。我正在处理一个文件并且这样做我用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中提到的那样,堆栈空间不够。

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

3 个答案:

答案 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看编译器选项。检查那里支持的堆大小的上限。