用C语言初始化3D全局数组

时间:2013-06-28 06:47:53

标签: c

我将全局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;  

我遇到了段错误。

我做错了什么?

2 个答案:

答案 0 :(得分: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;
        }
    }
}

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

答案 1 :(得分:6)

首先,arrays are not pointers

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

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

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

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

// common.h
extern void *ptr;

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

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

但如果你需要这样的黑客......你应该考虑你做错了什么。那么,在这种情况下,你做错了一件事:你正在使用全局变量。 不要使用它。