配列の要素の場所をみてみよう

C言語ではメモリを確保して、どこにどんな風にデータが格納されるか理解することはとても大切なことです。 ここでは実際に配列がどこにどんな風に割り当てられるか確認してみましょう。

下のコードでは、3要素を持つ int 型の配列 a を割り当てて、a、a[0]、a[1]、a[2] のそれぞれのアドレスを確認します。

コードの先頭では sizeof を使って、int そのもののサイズや a のサイズがどのようになっているかみています。

#include <stdio.h>

int main(void) {
  int i;
  int a[3];

  printf("sizeof(int)  = %ld\n", sizeof(int));
  printf("sizeof(a)    = %ld\n", sizeof(a));
  printf("Address of a = %p\n", a);
  printf("\n");

  a[0] = 10;
  a[1] = 20;
  a[2] = 30;

  for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
    printf("a[%d] = %d at %p\n", i, a[i], &a[i]);
  }

  return 0;
}

この実行結果結果は次のようになりました。

sizeof(int)  = 4
sizeof(a)    = 12
Address of a = 0x7fff210bcb40

a[0] = 10 at 0x7fff210bcb40
a[1] = 20 at 0x7fff210bcb44
a[2] = 30 at 0x7fff210bcb48

上から読んでいきましょう

まず、sizeof(int) の結果から、int のサイズが 4 (バイト) であることがわかりました。

次に sizeof(a) から配列 a は 12 バイトということになってます。プログラム上、a[3]、すなわち 3 要素を確保しているので、int が1個 4 バイトであることを考えると、確かに 12 バイトで OK ですね。

次の行で a のアドレスは 0x7fff210bcb40 だということがわかりました。これは、次の a[0] のアドレスとして同じく 0x7fff210bcb40 が表示されていることとつじつまがあいます。

そして、a[1]、a[2] と添字が増えていくと、アドレスは4バイトずつ増えて 0x7fff210bcb44、0x7fff210bcb48 となっています。

以上、配列のサイズと要素のアドレスが確認できました。