2017-06-12 11 views
4

callocを使用して割り当てられたバッファのサイズをbyteに知りたい。結果ヒープに割り当てられたバッファのサイズを調べる

double *buf = (double *) calloc(5, sizeof(double)); 
printf("%zu \n", sizeof(buf)); 

8私は一つの要素に変更された場合でも、私はまだ8私の質問があります:私のマシンで次のようにテストすることにより

  1. それは私だけ掛けることができますことを意味していますバイトでバッファサイズを得るには8 * 5? (私はsizeofが40を返すと思った)。
  2. バッファのサイズをバイトで返すマクロを作る方法(チェックするバッファはchar,int,double、またはfloat)?

いずれのアイデアもありがとうございます。

+0

Calloc()はmalloc()を呼び出すため、malloc.cは5322行以上のコードに渡っているため、メモリ割り当て関数の引数として渡す必要があります。 free()はcalloc()によって使用されるパラメータについて何も知らないので、私にとって意味があります – Marichyasana

+0

@Marichyasanaあなたのコメントはありません ' about [tag:c]、それはabout * some(仮説?)の実装です。実装はfree()が動作するために必要な情報をどのように格納するかを自由に選択できます。もちろん、次のブロックへのポインタはおそらくもっと簡単でしょう。もちろん、 'sizeOfChunk()'関数を提供する独自の 'malloc()'を実装することもできます。言語に*拡張*すること。そして、btw、無意味なことに、チャンクを割り当てるプログラムはサイズを知っています(割り当て関数に渡しました)。 –

答えて

6

C11、章§6.5.3.4、(強調鉱山

を引用sizeofオペレータが 発現または括弧名前であってもよい、そのオペランドのサイズ(バイト単位)、得られますタイプ。 サイズは、オペランドの のタイプから決定されます。 [...]

だから、あなたはメモリ位置のサイズはポインタによって取得することはできませんsizeof使用。あなたは自分自身でトラックを保持する必要があります。

具体的には、sizeof (double *)に相当します。これは基本的に、環境に応じて(ダブルに)ポインタのサイズを指定します。

割り当てられたメモリのサイズをメモリアロケータ関数から取得する一般的な方法も直接的な方法もありません。ただし、あなたが値を確認することができ、割り当てられたバッファの終わりをマークし、ループを使用するsentinel valueを使用することができますが、これはセンチネル値そのものを保持するための余分な要素の

  • 配分を意味
  • センチネル値は、メモリ内の許容値から除外する必要があります。

必要に応じて選択してください。

+0

...何のチャプター11を引用しますか? K&R? – d33j

+0

ありがとうございました。私は 'printf("%zu \ n "、sizeof(double *));'をテストし、 '8 'を得ました! 「自分でトラックを残す必要がある」と言ったように、このバッファのサイズが8 * 4 = 40バイトであることを知っておく必要があります。 – Don

+2

@ d33j申し訳ありません'C11'は見えませんか?これは章ではなく、それがCの標準です。 :)ああ、それは第6章です。 –

2

sizeof(buf)は、ポインターであり、ポインターであるバッファーのサイズではありません。

calloc()で割り当てられたブロックのサイズは、少なくともハードウェアによって課せられたメモリアラインメント要件のため、引数としてcalloc()に渡した値の積になります。
あなたのケースでは、バッファのサイズは少なくとも5 * sizeof(double)です。

Afaik動的に割り当てられたメモリブロックのサイズを見つける方法はありませんが、割り当てている限り、そのサイズはすでに分かっています。 malloc()calloc()realloc()またはその他

+0

ありがとうございます。よく説明されて:) – Don

関連する問題