2016-09-26 13 views
3

誰かがcでのメモリ割り当てについて教えてもらえますか? char変数のサイズは? 2または4? 配列内の2つの隣接するchar要素間のアドレス値の差が1にすぎないのはなぜですか?sizeof Char /配列の長さCでのメモリ割り当て

char foo [] = {'a', 'b'}; 
printf ("This is the Address of val1 %d \n", &foo[1]);   // -1079295441 
printf ("This is the Address of val2 %d \n", &foo[2]);   // -1079295440 
printf ("The size of each array member is %d \n", sizeof(foo)); // 2 
+0

'foo'は文字配列なので、本質的に単なるポインタなので、他の配列と同じサイズです。 – apokryfos

+0

"char変数のサイズは2か4ですか?" 1 – samgak

+1

@apokryfosですが、配列はポインタではありません。要素の種類や容量に応じてさまざまなサイズがあります。 –

答えて

3

あなたはアドレスを正しく印刷されていません。アドレスがintではないので、あなたはそれを印刷する%dを使用することはできません。代わりに、(「ポインタ」のため)%pを使用し、印刷のためvoid*にアドレスをキャスト:

printf ("This is the Address of val1 %p\n", (void*)&foo[1]); 

今、あなたのプログラムがこのまたは類似の出力生成:

This is the Address of val1 0xffbd2fcf 
This is the Address of val2 0xffbd2fd0 
The size of each array member is 2 

二つのポインタは、1でオフにされています単一のcharのサイズです。配列全体のサイズは2です。 1つの要素のサイズを印刷する場合は、foo[0]を使用します。

+0

@Okaこの回答には過度のキャストはありません –

+1

@Okaそれは必須です。 '%p'は' void * 'を望んでいるので、' int * 'を渡すことはUBとみなされます。 – dasblinkenlight

+0

ああ、これは 'void * 'へのポインタの安全な宣伝の例外です。これを推測することはvarargsと関係がありますか?面白い。 – Oka

関連する問題