这可能是一个基本问题,但我想为结构的三维数组分配内存。
我试图从一个文件中读取doubles,并希望存储在struct中。第一行是块编号(这里不相关,因为它总是1),第二行分别表示X、Y和Z坐标中的网格点数量。在这种情况下,X方向10点,Y方向5点,Z方向1点从第三行,是每个点的X,Y,Z坐标,这是我想读的双倍。首先是所有X分量(即10*5*1 X坐标,然后是类似的Y和Z)。文件格式如下:

      1
      10        5        1
  0.000000e+00   1.111111e+00   2.222222e+00   3.333333e+00
  4.444445e+00   5.555555e+00   6.666667e+00   7.777778e+00
  8.888889e+00   1.000000e+01   0.000000e+00   1.111111e+00
  2.222222e+00   3.333333e+00   4.444445e+00   5.555555e+00
  6.666667e+00   7.777778e+00   8.888889e+00   1.000000e+01
  0.000000e+00   1.111111e+00   2.222222e+00   3.333333e+00
  4.444445e+00   5.555555e+00   6.666667e+00   7.777778e+00
  8.888889e+00   1.000000e+01   0.000000e+00   1.111111e+00
  2.222222e+00   3.333333e+00   4.444445e+00   5.555555e+00
  6.666667e+00   7.777778e+00   8.888889e+00   1.000000e+01
  0.000000e+00   1.111111e+00   2.222222e+00   3.333333e+00
  4.444445e+00   5.555555e+00   6.666667e+00   7.777778e+00
  8.888889e+00   1.000000e+01...and so on...

我可以读取前4个整数,因此我知道要存储数据的点数。然后我使用malloc函数分配内存并将数据存储在变量中。当我执行程序时,它读取整数,但无法读取双精度数。我犯了什么错?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct{
    double x,y,z;
}Mesh;

int main(void)
{
    int nblocks, IMAX, JMAX, KMAX;

    Mesh ***grid;

    FILE *mesh = fopen("test.x","r");

    fscanf(mesh,"%i %i %i %i",&nblocks,&IMAX,&JMAX,&KMAX);
    printf("%i %i %i %i\n",nblocks,IMAX,JMAX,KMAX);

    grid = malloc(sizeof(Mesh)*nblocks*IMAX*JMAX*KMAX);

    fscanf(mesh,"%lf",&grid[0][0][0].x);
    printf("%lf\n",grid[0][0][0].x);

    fclose(mesh);

    return 0;
}

程序在编译时不会给出任何错误,但它不会读/写存储在结构的x变量中的变量。(如果这个方法有效,我可以将它放入循环中,以便读取我在这里没有完成的所有值。)
如果在我读入Mesh grid[IMAX][JMAX][KMAX]后定义IMAX,JMAX,KMAX,我将得到正确的输出。但想知道指针的工作方式是如何工作的。
谢谢您,
普拉纳夫

最佳答案

你有一个四维数组,而不是三维。尺寸为:
nblocks
IMAX
JMAX
KMAX
因此,grid的类型必须是Mesh****,而不是Mesh***

Mesh ****grid;

grid分配内存的代码必须是:
grid = malloc(nblocks * (sizeof *grid));
for ( block = 0; block < nblocks; ++block )
{
   grid[block] = malloc(IMAX * (sizeof *grid[0]));
   for ( i = 0; i < IMAX ; ++i )
   {
      grid[block][i] = malloc(JMAX * (sizeof *grid[0][0]));
      for ( j = 0; j < JMAX ; ++j )
      {
         grid[block][i][j] = malloc(KMAX * (sizeof *grid[0][0][0]));
      }
   }
}

现在,可以使用以下方法访问网格数据:
grid[block][index][jindex][kindex]

这些是有效的用法:
fscanf(mesh,"%lf",&grid[0][0][0][0].x);
printf("%lf\n",grid[0][0][0][0].x);

09-30 15:54