我正在尝试安排3维动态内存,我的代码如下:
typedef unsigned char matrix;
matrix ***mat(int n, int b)
{
matrix ***temp = (matrix ***)malloc(n*sizeof(matrix**));
for(int i=0; i<n; i++)
{
temp[i] = (matrix **)malloc(b*sizeof(matrix *));
for(int j = 0; j < b; j++)
temp[i][j]= (matrix *)malloc(b*sizeof(matrix));
}
return temp;
}
int main()
{
matrix ***M2 = mat(3,2);
for(int i=0; i<3; i++)
{
for(int j=0; j<2; j++)
{
for(int k=0; k<2; k++)
{
printf(" %d", M2[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
当我运行该程序时,我遇到了段冲突,因为我无法可视化,所以有人可以告诉我错误是什么
答案 0 :(得分:2)
我猜在最嵌套的for循环(j
)中,变量在声明for(int j = 0; i < b; i++)
中被弄乱了。全部尝试j
答案 1 :(得分:0)
您必须更正mat函数中嵌套的for循环内的j计数器,这是正确的:
for(int j = 0; j < b; j++)
答案 2 :(得分:0)
通常,我会在FORTRAN中做这种事情,我个人喜欢在FORTRAN中将涉及高维数组的算法编写为库,并在C中进行流程控制。尽管3D在C中仍然易于管理,但是您需要对指针非常小心,这是一个有效的示例,它是valgrind clean。
#include <stdio.h>
#include <stdlib.h>
float ***myarray(int l, int m, int n)
{
float **ptr = malloc(sizeof(float*)*(l+l*m));
float *data = malloc(sizeof(float)*l*m*n);
float **p1 = ptr, **p2 = ptr+l;
for(int i=0; i<l; i++) {
p1[i] = (float*)(p2+i*m);
for(int j=0; j<m; j++)
p2[i*m+j] = data+(i*m+j)*n;
}
return (float***)ptr;
}
void myfree(float ***a)
{
free(a[0][0]);
free(a);
}
int main()
{
float ***array = myarray(4,3,2);
for(int i=0; i<4; i++)
for(int j=0; j<3; j++)
for(int k=0; k<2; k++)
array[i][j][k] = i+j+k;
myfree(array);
return 0;
}