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

Arj*_*Rao 0 c

我将全局3D数组定义为

double*** arr;  
Run Code Online (Sandbox Code Playgroud)

在common.c文件中

我有声明

extern double*** arr;  
Run Code Online (Sandbox Code Playgroud)

在common.h文件中

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

 exs =malloc(sizeof(double)*nx*ny*nz);  
Run Code Online (Sandbox Code Playgroud)

其中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;  
Run Code Online (Sandbox Code Playgroud)

我得到了一个段错误.

我究竟做错了什么 ?

Som*_*ude 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 6

首先,数组不是指针.

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

double (*arr)[ny][nz] = malloc(sizeof(*arr) * nx);
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以使用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;
Run Code Online (Sandbox Code Playgroud)

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