2016-10-16 9 views
-1

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"); 
} 

は、デバッグのヒント/エラーが発生しました:

enter image description here

が、私はラインB[i][j][k] = 1.0;を切断した場合、すべてのものはOKです。私はこのことで何が間違っているのか理解できません。どんな助けも訴えられるでしょう。

+1

これは++明確C、ではないCです。また、 'free(p [0]); free(p); 'はメモリをリークします。 – CoffeeandCode

+0

[複製不可能](http://coliru.stacked-crooked.com/a/0999d26ba886ec13) – CoffeeandCode

+0

バージョン2は偽であり、あなたは決して 'p [1]'などを割り当てません。 –

答えて

0

あなたはどちらが失敗したかは言いませんが、どちらも間違っているので本当に問題ではありません。

Cでは、void **型またはvoid ***型をdouble型に変換することはできません。また、定義されていない動作を引き起こさずにdouble型を入力することもできません。あなたの例の両方の機能がこれを行います。

あなたが想像しているようにメモリを割り当てる汎用関数を正しく書くことは非常に不便で、おそらく実際には不可能です。

良い方法がありますが、変数な長アレイに使用ポインタ:あなたは一度だけ自由に呼び出す必要があり

double (*d)[y][x] = malloc(z * y * x * sizeof(double)); 
d[z-1][y-1][x-1] = 123.45; 

free(d); 
+1

これは非常に便利です!どうもありがとう。 – Albert

関連する問題