gpt4 book ai didi

c - 使用 3D 动态数组的函数中出现段错误

转载 作者:行者123 更新时间:2023-11-30 19:35:20 24 4
gpt4 key购买 nike

我正在编写一个代码,其目的是操作来自 3D 数组的 1D 数组。显示代码将解释一切:

首先,我正在使用结构数组:

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);
}

注释的 for 循环至关重要,所以请记住它。现在,解决我的问题,我需要使用 3D 数组,例如:

RANGE ***memrangeTAR;

函数*dq_Eloss_load_range_file将文件内容加载到RANGE类型的数组中。我想对几个文件执行此操作,这些文件根据两个参数 AionZion 命名。在我看来,它会是这样的:

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

这将是与 Aion 和 Zion 相关的文件中第 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);
// }

}
}

}

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

我做错了什么?

最佳答案

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

范围 *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);
}

这样就不会遇到段错误错误,让我认为问题是我将指针传递给函数的方式,但仍然不明白......

关于c - 使用 3D 动态数组的函数中出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com