我是一个初学者,我正在编写一个代码,其中使用 malloc、malloc 变体分配多维数组。我必须添加一个更高维度的数组(3D 而不是 2D)。
我发现了一种奇怪的行为,非常感谢您的解释。
我知道这并不是处理多维数组的正确方法。但它已经在我正在修改的程序中使用了。
这是我用来隔离 onlinegbd.com 中问题的工作代码:
#include <stdio.h>
#include <stdlib.h>
double ***AllocArray3D(short ix, int iy, int iz){
double ***A3D; ix++; iy++;
A3D = (double ***)malloc(ix * sizeof(double **));
int i, j;
for (i = 0; i < ix; i++) {
A3D[i] = (double **)malloc(iy * sizeof(double *));
for (j = 0; j < iy; j++) {
A3D[i][j] = (double *)malloc(iz * sizeof(double));
if(!(j+1 < iy))printf("alloc i=%d,j=%d\n",i,j); //debug
}
}
return A3D;
}
void FreeArray3D(double *** A3D, int ix, int iy){
ix++; iy++;
int i, j;
for (i = 0; i < ix; i++) {
for (j = 0; j < iy; j++) {
if(!(j+1 < iy))
printf("free i=%d,j=%d\n",i,j); //wenn das der letzte durchlauf ist printe
free(A3D[i][j]);
}
free(A3D[i]);
}
free(A3D);
}
int main(){
int a=99, b=99;
double *** A_xyz;
A_xyz = AllocArray3D(a, b, 1309);
FreeArray3D(A_xyz, a, b);
return 0;
}
当我将一个函数更改为(注意 for 循环条件的变化)时:
double ***AllocArray3D(short ix, int iy, int iz){
double ***A3D;//x++; iy++;
A3D = (double ***)malloc(ix * sizeof(double **));
int i, j;
for (i = 0; i < (ix+1); i++) {
A3D[i] = (double **)malloc(iy * sizeof(double *));
for (j = 0; j < (iy+1); j++) {
A3D[i][j] = (double *)malloc(iz * sizeof(double));
if(!(j+1 < iy))printf("alloc i=%d,j=%d\n",i,j); //debug
}
}
return A3D;
}
or(注意for循环条件的变化):
double ***AllocArray3D(short ix, int iy, int iz){
double ***A3D; x++; iy++;
A3D = (double ***)malloc(ix * sizeof(double **));
int i, j;
for (i = 0; i <= ix; i++) {
A3D[i] = (double **)malloc(iy * sizeof(double *));
for (j = 0; j <= iy; j++) {
A3D[i][j] = (double *)malloc(iz * sizeof(double));
if(!(j+1 < iy))printf("alloc i=%d,j=%d\n",i,j); //debug
}
}
return A3D;
}
我已经检查过我可以使用该数组,并且每个分配都不为 NULL,但 free() 函数失败。
我错过了什么?我将非常感谢您的解释。预先感谢