GCCコンパイラを使用してコードブロックに動的に3D配列を割り当てるコードをいくつか書いた。動的に割り当てられた3D配列を割り当てるときにプログラムブームが発生する
バージョン1:
void*** alloc3(int n_s, int n_row, int n_col, int size)
{
void*** p=(void***)malloc(n_s*sizeof(void**));
int i,j,k;
if (p==NULL) return NULL;
for(i=0;i<n_s;i++){
p[i] = (void**)malloc(n_row*sizeof(void*));
for(j=0;j<n_row;j++)
{
p[i][j]=(char*)malloc(n_col*size);
if(p[i][j]==NULL) {free(p[0]);free(p);return NULL; }
}
}
return p;
}
バージョン2:
void*** alloc3 (int n1, int n2, int n3, int size)
{
int i3,i2;
void ***p;
if ((p=(void***)malloc(n3*sizeof(void**)))==NULL)
return NULL;
if ((p[0]=(void**)malloc(n3*n2*sizeof(void*)))==NULL) {
free(p);
return NULL;
}
if ((p[0][0]=(void*)malloc(n3*n2*n1*size))==NULL) {
free(p[0]);
free(p);
return NULL;
}
for (i3=0; i3<n3; i3++) {
p[i3] = p[0]+n2*i3;
for (i2=0; i2<n2; i2++)
p[i3][i2] = (char*)p[0][0]+size*n1*(i2+n2*i3);
}
return p;
}
私はこれらのコードをテストしました。
double*** B= (double***)alloc3(n_row,n_col,n_s,sizeof(double));
for(int i=0;i<n_s;i++)
{
for(int j=0;j<n_row;j++)
{
for(int k=0;k<n_col;k++)
{
printf("(%d,%d,%d)\t",i,j,k);
B[i][j][k] = 1.0;
}printf("\n");
}printf("----------\n");
}
は、デバッグのヒント/エラーが発生しました:
が、私はラインB[i][j][k] = 1.0;
を切断した場合、すべてのものはOKです。私はこのことで何が間違っているのか理解できません。どんな助けも訴えられるでしょう。
これは++明確C、ではないCです。また、 'free(p [0]); free(p); 'はメモリをリークします。 – CoffeeandCode
[複製不可能](http://coliru.stacked-crooked.com/a/0999d26ba886ec13) – CoffeeandCode
バージョン2は偽であり、あなたは決して 'p [1]'などを割り当てません。 –