计算循环期间的Segfault

时间:2016-02-16 08:11:31

标签: c segmentation-fault

我写了一些代码来解决一些物理问题。不幸的是我无法显示整个代码(它们太长并且属于私人项目),但粗略地说,我的程序结构是

double **array1;  // declared globally
double **array2;  // because there are a lot of functions using array1 & 2

main{
    double x;
    fscanf(input);  // reading an input file
    fclose(input);  // input file have information about dimension of array
                    // and step to do different calculation

    array = *calloc(~);
    array[i] = calloc(~);   // making 2d array with dimension from input file

    for(i=0;i<large number;i++){
    // (doing physical calculation using array1 and array2);       
        if(i==some step from input file){
            // (calculation using array2)
            x = array1[k][0]-array1[l][0] ...   // !!SEGFAULT!!
    }
}

问题是无论数组的大小或输入文件中包含的任何其他变量,程序何时接近!! SEGFAULT !!区域,它产生分段错误(使用gdb ...)。 “一些步骤”可以是1,10,100,...,我尝试了几种不同输入文件内容的测试,但程序只在该区域产生段错误。 Valgrind说没有内存泄漏。

有一点奇怪的是,在程序开始时,gdb说array1的地址是(double **)0x68e410,并且在程序到达问题点之前这不会改变。此时,array1的地址变为(double **)0x3ff223bf06cdec4d,我无法访问array1的任何元素。

如果我将“一些步骤”设置得非常大,我可以避免段错问题,但这不是解决方案并且污染了我们项目的计算过程......这个问题的根源是什么?

1 个答案:

答案 0 :(得分:0)

鉴于信息不足......

这两行是问题的根源。

array = *calloc(~);
array[i] = calloc(~); 

使用具体的例子:

int **array = NULL;
// notice, in following line that the second parameter to calloc() 
// is the size of a pointer
array = calloc( 100, sizeof(int*) );

// each entry in the array[] 
// must be set to point to some (more) allocated memory
for( int i=0; i<100; i++ )
{
    array[i] = calloc( 20, sizeof( int ) );
}

当然,每次调用calloc()后都必须进行检查,以确保返回的值不为NULL。