1

動的に定義された 3D 配列が次のように定義されている場合:

float   ***tmparray;
int     ii, jj;

tmparray = calloc(100, sizeof(tmparray));

for(ii = 0; ii < 100; ii++)
   tmparray[ii] = calloc(100, sizeof(tmparray[ii]));

for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      tmparray[ii][jj] = calloc(2, sizeof(tmparray[ii][jj]));
   }
}

次に、次のようなことができますか

for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      free(tmparray[ii][jj]);
   }
}

そして、通常の 2D 配列のように使用し続けますか? それともこれは許可されていませんか?

編集:これは実装されたコードではありません。これは好奇心からです。したがって、その意味では「実際の」コードではありません。

4

2 に答える 2

1

これ:

tmparray = calloc(100, sizeof(tmparray));

間違っている:

  1. calloc()ポインタで使用するのは意味がありません。「すべてのビットがゼロ」は、ポインタに対して明確に定義された意味を持つことが保証されていません。
  2. サイズが間違っています。ポインタのサイズで100個のアイテムが必要だと言っているので、そうする必要がありますsizeof *tmparray
  3. これは関数ではないことに注意してくださいsizeof。括弧は、引数がキャスト式(のようにsizeof (int))である場合にのみ必要です。
于 2012-11-13T14:53:03.750 に答える
0

calloc中に間違いがあります。

tmparray = calloc(100, sizeof(*tmparray));

for(ii = 0; ii < 100; ii++)
   tmparray[ii] = calloc(100, sizeof(*tmparray[ii]));

for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      tmparray[ii][jj] = calloc(2, sizeof(*tmparray[ii][jj]));
   }
}

そして、質問に戻って、単にいいえ、あなたはできません、なぜなら

sizeof(*tmparray[ii]) == sizeof(float*) 

その間

sizeof(*tmparray[ii][jj]) == sizeof(float)

PS 32ビットマシンでは動作するはずですが、移植性のある方法ではありません。

于 2012-11-13T14:52:25.823 に答える