2012-12-22 10 views
9

可能性の重複:
How to find the sizeof(a pointer pointing to an array)Cである場合、malloc()と配列の長さ

私はCで動的配列を作成する方法を学んでいるが、私はできる問題に遭遇してきました把握できない。

私はコードを使用する場合:

int num[10]; 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

を私は出力を得る:

sizeof num = 40 
sizeof num[0] = 4 

これは私が起こることを期待するものです。私は次のように配列のサイズををmalloc場合は:

int *num; 
num = malloc(10 * sizeof(int)); 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

それから私は、出力を得る:

sizeof num = 8 
sizeof num[0] = 4 

私は固定を使用する場合、配列のサイズが40である理由を知りたいですよ私がmalloc()を使用しているときではありません。

+0

'num'は2番目のケースではintへのポインタであり、そのサイズはマシンによって異なります。すなわち、32ビットの場合は4バイト、64ビットの場合は8バイトです.1番目の場合numはポインタではありません。base array 'の 'address'を使用します。したがって、sizeof()は配列の合計サイズを返します。 。 – krpra

答えて

16

2番目のケースでは、numは配列ではありません。ポインタです。 sizeofはあなたのプラットフォーム上で8バイトと思われるポインタのサイズを与えています。

動的に割り当てられた配列のサイズを知る方法はありません。別の場所に保存する必要があります。 sizeofは型を調べますが、のような指定されたサイズの配列型はmallocの結果から完全な配列型を取得できません。また、sizeof引数を不完全型に適用することはできませんたとえばint[]のようになります。

+0

あなたが唯一それがnum' 'の数の必要を解放することはできないのポインタを提供するとともに、なぜコンパイラベンダーが提供することができ、ヒープ割り当てられたチャンクの' free'機能が働いているか、コンパイラまたはO/S維持レコード/トラックを知っていますヒープレコードからこの 'num'を検索する機能 ユーザが 'free(ptr) 'を呼び出すたびに –

+0

@BuddhikaChaturanga申し訳ありませんが、私が正しく理解しているかどうかわかりません:なぜヒープに割り当てられたメモリチャンクの詳細を公開していないのですか?同様に、与えられたポインタは情報を取得しますか? – effeffe

+0

彼らはすでに動的に割り当てられたデータについての情報を持っている場合、彼らはfree' 'のためにそれを使用している場合ええ...、なぜ彼らはそのような情報を得るためには、ユーザ(開発者)への機能性を提供することはできません... :) –

2

第2のサイズは、あなたのマシンではおそらく64ビットであるポインタのサイズを指し、8バイトです。

動的に割り当てられた構造体のサイズを回復するのに、sizeof()を使用することはできませんが、静的に割り当てられた構造体に対して行うことはできます。

4

配列はポインタではありません(いくつかの状況では、ポインタへの崩壊ではなく、ここにはありません)。

最初のものは配列なので、sizeofは配列のサイズ= 40バイトを与えます。

2番目の数字はポインタです(指し示す要素の数に関係なく) - sizeofsizeof(int*)です。

0

割り振ったもののサイズを知りたい場合は、自分のコードが割り振りを行っているので、自分自身を「覚えておく」必要があります。あなたのコードが割り当てを行っていない場合、ポインタが指しているメモリの大きさを調べる方法は[標準的な意味では]ありません。他の方法で "知って"いるだけです。

関連する問題