我将全局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;
我遇到了段错误。
我做错了什么?
答案 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)
其次,让我向您展示另一种尝试避免内存碎片的解决方案,并使用一次调用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;
但如果你需要这样的黑客......你应该考虑你做错了什么。那么,在这种情况下,你做错了一件事:你正在使用全局变量。 不要使用它。