我正在处理一个代码,其目的是操纵来自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类型的数组。我想为几个文件执行此操作,这些文件根据两个参数Aion
和Zion
命名。在我的脑海里它会一直是这样的:
(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循环取消注释,它会给我分段错误。
我在做什么错?
首先请阅读[为什么“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'分配内存?最后,*你在哪里得到这次事故?在哪一行?请用例如一条评论。如果你不知道,那么学习如何使用调试器来捕捉崩溃。 –
代码中没有3D数组。作为一名三星级C程序员并不是一种恭维。使用'***'几乎总是错误代码的信号。 – Olaf
做一个真实的3D的分配,如'mytype(* X)[a] [b] = malloc(sizeof(mytype [n] [a] [b]));'。 –