-1

2D 配列を動的に割り当てました。ここにコードがあります

int **arrofptr ;
arrofptr = (int **)malloc(sizeof(int *) * 2);
arrofptr[0] = (int *)malloc(sizeof(int)*6144);
arrofptr[1] = (int *)malloc(sizeof(int)*4800);

arrofptr、arrofptr [0]、arrofptr [1]に割り当てられているバイト数を知る必要がありますか? サイズを知る方法はありますか?

印刷する場合

sizeof(arrofptr);
sizeof(arrofptr[0]);
sizeof(arrofptr[1]);

次に、4を出力します。

4

4 に答える 4

2

arrofptrのサイズは、ポインターへのポインターにすぎないため、見つかりません。それを使用して配列の配列を定義しています。ポインターだけでサイズ情報を伝える方法はありません。サイズ情報を自分で維持する必要があります。

于 2012-09-28T06:39:47.033 に答える
1

取得する唯一の戻り値malloc()は、割り当てられた領域の最初のバイトへのポインターです (またはNULL失敗した場合)。そのようなポインターから関連付けられた割り当てサイズを取得する移植可能な標準的な方法はないため、一般的に答えはnoです。

C のやり方は、配列とバッファーを一般に値のペア (ベースアドレスとサイズ) で表すことです。ちなみに、後者は通常、size_tへの引数と同じ型malloc()です。

于 2012-09-28T07:13:11.133 に答える
1

割り当てられたコードブロックのサイズを追跡したい場合は、割り当てたメモリブロックにその情報を保存する必要があります。

// allocate 1000 ints plus one int to store size

int* p = malloc(1000*sizeof(int) + sizeof(int)); 
*p = (int)(1000*sizeof(int));
p += sizeof(int);

...

void foo(int *p)
{
  if (p)
  {
    --p;
    printf( "p size is %d bytes", *p );
  }
}

代替。構造体に入れる

struct
{
  int size;
  int *array;
} s;
于 2012-09-28T07:21:54.567 に答える