0

3D 配列に連続したスペースを割り当てる必要があります。(編集:) 最初にこれを明確にするべきだったと思いますが、実際の製品コードでは、実行時まで配列の次元を知りません。簡単にするために、以下のおもちゃのコードでそれらを定数として提供しました。連続したスペースを主張することの潜在的な問題を知っていますが、それを持たなければなりません。2D 配列でこれを行う方法を見てきましたが、パターンを 3D に拡張する方法がわかりません。関数を呼び出してメモリを解放するとfree_3d_arr、エラーが発生します。

lowest lvl
mid lvl
a.out(2248,0x7fff72d37000) malloc: *** error for object 0x7fab1a403310: pointer being freed was not allocated

誰かが修正が何であるかを教えていただければ幸いです。コードはここにあります:

#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);

}
4

2 に答える 2

1

次のようなことができます。

int ***allocateLinearMemory(int x, int y, int z)
{
    int *p = (int*) malloc(x * y * z * sizeof(int));
    int ***q = (int***) malloc(x * sizeof(int**));
    for (int i = 0; i < x; i++)
    {
        q[i] = (int**) malloc(y * sizeof(int*));
        for (int j = 0; j < y; j++)
        {
            int idx = x*j + x*y*i;
            q[i][j] = &p[idx];
        }
    }
    return q;
} 

void deallocateLinearMemory(int x, int ***q)
{
    free(q[0][0]);
    for(int i = 0; i < x; i++)
    {
        free(q[i]);
    }
    free(q);    
}

私はそれを使用し、正常に動作します。

于 2016-12-23T11:58:17.300 に答える