3D配列に連続したスペースを割り当てる必要があります。 (編集:)私は、最初の場所でこのクリアを作成しなければなりませんでしたが、実際の生産コードでは、実行時まで配列の寸法はわかりません。物事を単純にするために、以下の私のおもちゃのコードでそれらを定数として提供しました。私は連続した空間を主張する潜在的な問題を知っていますが、私はそれを持っていなければなりません。私は2D配列に対してこれを行う方法を見てきましたが、明らかにパターンを3Dに拡張する方法を理解していません。私はメモリ、free_3d_arr
を解放する関数を呼び出すと、私はエラーを取得する:誰でも修正があるものを私に言うことができる場合Cの3D配列に連続したメモリを割り当てる
lowest lvl
mid lvl
a.out(2248,0x7fff72d37000) malloc: *** error for object 0x7fab1a403310: pointer being freed was not allocated
はそれをお願い申し上げます。コードはここにある:あなたがCを使用しているので
#include <stdio.h>
#include <stdlib.h>
int ***calloc_3d_arr(int sizes[3]){
int ***a;
int i,j;
a = calloc(sizes[0],sizeof(int**));
a[0] = calloc(sizes[0]*sizes[1],sizeof(int*));
a[0][0] = calloc(sizes[0]*sizes[1]*sizes[2],sizeof(int));
for (j=0; j<sizes[0]; j++) {
a[j] = (int**)(a[0][0]+sizes[1]*sizes[2]*j);
for (i=0; i<sizes[1]; i++) {
a[j][i] = (int*)(a[j]) + sizes[2]*i;
}
}
return a;
}
void free_3d_arr(int ***arr) {
printf("lowest lvl\n");
free(arr[0][0]);
printf("mid lvl\n");
free(arr[0]); // <--- This is a problem line, apparently.
printf("highest lvl\n");
free(arr);
}
int main() {
int ***a;
int sz[] = {5,4,3};
int i,j,k;
a = calloc_3d_arr(sz);
// do stuff with a
free_3d_arr(a);
}
'a [0] = ...'の後に 'a [j] = ...'がついているようです... –
3次元配列はありません。あなたのコード!ポインタは配列ではありません! 3D配列が必要な場合は、1つを使用します。ああ、3スターのCプログラマであることは褒め言葉ではありません。 – Olaf
これは、SOはクラウドソースデバッガではないことを示しています。 –