2014-01-22 15 views
0

我遇到以下代码的一些问题。 newrows是一个直接赋值给我正在工作的函数的参数。使用另一个参数可以提前计算一些元素。不知何故,对于一些新的组合和元素的值,我得到一个核心转储,而其他组合工作正常。通常,在发生核心转储时,会有20000到25000次迭代。但是,当一切正常时,最多有40000次迭代。通过数组迭代时的核心转储

int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //int32_t norm, angle, rohmax; 
    //double r, alpha, beta, m, mu; 



    //initialize arrays 

    for(i=0; i<newrows; i++){ 
     for(j=0; j<elements; j++){ 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 

     } 
    } 

组合工作正常:200:188

组合,导致核心转储:200:376

我使用Linux BTW :-)

回答

0

这是最有可能的一个堆栈空间问题。请注意,newimagepixelcounter正被分配到堆栈框架中,而这些堆栈框架正在声明它们的任何函数。您可以快速耗尽空间,试图分配大量数据。您的3D阵列newimage成长,如

#bytes = newrows * elemets * 3

我清理你的程序(一个好建议是尝试和编译本程序,所以人可以帮助你更快!):

#include <stdio.h> 
#include <stdint.h> 

void test(size_t newrows, size_t elements) { 
    int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //initialize arrays 

    for(size_t i=0; i<newrows; i++) { 
     for(size_t j=0; j<elements; j++) { 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 
     } 
    } 
} 

int main(void) { 
    printf("Size of integer = %ld\n", sizeof(int)); 
    for (size_t i = 700; ; i += 10) { 
      printf("Testing (%ld, %ld)\n", i, i); 
      test(i, i); 
    } 
    return 0; 
} 

并运行此,我看到:

Size of integer = 4 
Testing (700, 700) 
Testing (710, 710) 
Testing (720, 720) 
Testing (730, 730) 
[3] 13482 segmentation fault (core dumped) ./a.out 

所以720^2 * 3 * 4730^2 * 3 * 4字节之间的某个地方,这是一个在我的64位Linux计算机上回合6 MiB,它可能在您的计算机上不同。

在这种情况下的解决方案是在堆上分配您的阵列,在那里您将有更多的内存可供使用。有关堆分配多维数组的更多信息,请参阅How does C allocate space for a 2D (3D...) array when using malloc?