我写了一些代码来解决一些物理问题。不幸的是我无法显示整个代码(它们太长并且属于私人项目),但粗略地说,我的程序结构是
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的任何元素。
如果我将“一些步骤”设置得非常大,我可以避免段错问题,但这不是解决方案并且污染了我们项目的计算过程......这个问题的根源是什么?
答案 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。