0

我将全局 3D 数组定义为

double*** arr;  

在文件 common.c 中

我有声明

extern double*** arr;  

在文件 common.h 中

现在当我在运行时动态初始化这个数组时,我遇到了一个分段错误我执行了代码

 exs =malloc(sizeof(double)*nx*ny*nz);  

其中 nx,ny 和 nz 在执行该语句之前在运行时是已知的。

但是当我尝试将此数组初始化为

  for(i=0;i<nx;i++)  
      for(j=0;j<ny;j++)  
          for(k=0;k<nz;k++)  
              arr[i][j][k]=0.0e0;  

我得到一个段错误。

我究竟做错了什么 ?

4

2 回答 2

7

您需要分配所有维度:

arr = malloc(sizeof(*arr) * nx);
for (int i = 0; i < nx; i++)
{
    arr[i] = malloc(sizeof(**arr) * ny);
    for (int j = 0; j < ny; j++)
    {
        arr[i][j] = malloc(sizeof(***arr) * nz);
        for (int k = 0; k < nz; k++)
        {
            arr[i][j][k] = 0.0;
        }
    }
}

当然不要忘记释放您分配的所有数据。

于 2013-06-28T06:51:24.523 回答
6

首先,数组不是指针

其次,让我向您展示另一种解决方案,它试图避免内存碎片并使用对malloc()函数的一次调用(这很昂贵):

double (*arr)[ny][nz] = malloc(sizeof(*arr) * nx);

在此之后,您可以将arr其用作维度数组nx * ny * nz

如果您希望在文件范围内使用它:将其声明为void *,为元素分配内存nx * ny * nz,然后在使用时将其分配给指向数组的指针:

// common.h
extern void *ptr;

// common.c
ptr = malloc(sizeof(double) * nx * ny * nz);

// foo.c
double (*arr)[ny][nz] = ptr;

但是,如果您需要这样的技巧……您应该考虑自己做错了什么。好吧,在这种情况下,你做错了一件事:你使用了一个全局变量。不要使用它。

于 2013-06-28T06:54:25.443 回答