我将全局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)
我得到了一个段错误.
我究竟做错了什么 ?
您需要分配所有维度:
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)
但如果你需要这样的黑客......你应该考虑你做错了什么.那么,在这种情况下,你做错了一件事:你正在使用全局变量.不要使用它.