2017-03-15 66 views
-1

我正在处理一个代码,其目的是操纵来自3D数组的一维数组。显示的代码会解释一切:使用3D动态数组的函数中的分段错误错误

首先,我与结构的阵列工作:

typedef struct range_in_memory { 
     double E, R; 
} RANGE; 

而且我写了这个功能简单的调试实现调用时就像一个魅力:

RANGE *dq_Eloss_load_range_file (double Aion, double Zion, double Atar, double Ztar, int *n){ 

     char *filename; 
     char errormsg[80], dummy; 
     int N = 2; 
     int i = 0; 
     FILE *fp; 
     RANGE *memrange; 

     filename = (char*)malloc (50*sizeof (char)); 
     dq_Eloss_set_filename (filename, Aion, Zion, Atar, Ztar); 
     fp = dq_myfopen (filename, "r", errormsg); 

     while (!feof (fp)){ 
     fscanf (fp, "%c", &dummy); 

     if (dummy == '\n') { 
      N++; 

     } 
     } 

     rewind (fp); 

     memrange = (RANGE*) calloc (N, sizeof (RANGE)); 

     while (!feof (fp)){ 
     fscanf (fp, "%lf\t%lf\n", &memrange[i].E, &memrange[i].R); 
     i++; 
     } 
     *n = N; 

    // for (i=0; i<N; i++){ 
    //   printf ("\n%lf %lf", memrange[i].E, memrange[i].R); 
    // } 

     fclose (fp); 

     return (memrange); 
} 

评论的周期是至关重要的,所以记住它。 现在,来参加我的问题,我需要使用3D阵列,如:

RANGE ***memrangeTAR; 

功能​​加载文件的内容INT RANGE类型的数组。我想为几个文件执行此操作,这些文件根据两个参数AionZion命名。在我的脑海里它会一直是这样的:

(double) memrangeTAR [Aion][Zion][i].E 
(double) memrangeTAR [Aion][Zion][i].R 

这将在与永恒之塔锡安文件中的第i行已经值。

这是代码:

void dq_load_range_files (RANGE ***memrangeTAR){ 
    int NTAR; 
    double *ZMAX; 
    int Aion, Zion, AMAX = 250.; 
    int i; 



    printf ("\n Allocating Memory for range data..."); fflush (stdout); 
    ZMAX = (double*) malloc ((AMAX+1)*sizeof (double)); 
    memrangeTAR = (RANGE***) malloc ((AMAX+1)*sizeof (RANGE**)); 


    for (Aion=1; Aion<=AMAX; Aion++){ 
    ZMAX[Aion] = ceil (dq_range_table_get_max_Zion (Aion)); 
    memrangeTAR [Aion] = (RANGE**) malloc ((ZMAX[Aion]+1)*sizeof(RANGE*)); 
    } 

    printf (" ...ALLOCATED!         \n\n"); 


    printf ("\n Loading range data...\n"); fflush (stdout); 

    for (Aion=1; Aion <=AMAX; Aion++){ 

     for (Zion=1; Zion<=ZMAX[Aion]; Zion++){ 

     memrangeTAR [Aion][Zion] = dq_Eloss_load_range_file ((double)Aion, (double)Zion, cor_sosau16.mass.Mtar, cor_sosau16.charge.Ztar, &NTAR); 

// for (i=0; i<N; i++){ 
//   printf ("\n%lf %lf", memrangeTAR[Aion][Zion][i].E, memrangeTAR[Aion][Zion][i].R); 
// } 

    } 
    } 

} 

它编译器(gcc UNIX机器上使用gnu99标准)。它运行除非我尝试访问3D数组。如果我在第一个函数中取消注释打印周期,我可以得到我想要的:它在终端上打印当前文件的内容。如果我对第二个函数中的for循环取消注释,它会给我分段错误。

我在做什么错?

+0

首先请阅读[为什么“while(!feof(file))”总是出错?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。其次,请阅读[我输入malloc的结果吗?](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。第三,为什么你为'filename'分配内存?最后,*你在哪里得到这次事故?在哪一行?请用例如一条评论。如果你不知道,那么学习如何使用调试器来捕捉崩溃。 –

+3

代码中没有3D数组。作为一名三星级C程序员并不是一种恭维。使用'***'几乎总是错误代码的信号。 – Olaf

+0

做一个真实的3D的分配,如'mytype(* X)[a] [b] = malloc(sizeof(mytype [n] [a] [b]));'。 –

回答

0

我以某种方式设法解决但不明白为什么这是一个解决方案。 通过定义

RANGE *tmp;

变量,调用通常的功能作为

tmp = dq_Eloss_load_range_file ((double)Aion, (double)Zion, cor_sosau16.mass.Mtar, cor_sosau16.charge.Ztar, &NTAR);

然后,指派想指针:

memrangeTAR[Aion][Zion] = tmp;

我可以使用的内容现在任何方式的变量,如:

for (i=0; i<N; i++){ 
     printf ("\n%lf %lf", memrangeTAR[Aion][Zion][i].E, 
           memrangeTAR[Aion][Zion][i].R); 
    } 

这样没有遇到分段错误,让我觉得现在的问题是我经过函数指针的方式,但还是不明白......