ここでは C 言語の変数が実際にどのようにメモリ空間に配置されているのか、sizeof 演算子やアドレス演算子を通じて学びます。


1. sizeof 演算子で変数の使用データサイズを調べる

C 言語の変数の事を「何だか良く分からないけど、数字を入れる箱みたいな物」と漠然と覚えている人も多いのですが、正しくは「メモリ空間内にある 1 〜 多バイトからなるデータ領域」のことを変数と言います。

さて、 C 言語の変数には char 型、int 型 など様々なデータ型がありますが、それらの変数が実際のところメモリ空間内で何バイト分のデータになっているか調べるためには「sizeof演算子」を使います。

この sizeof 演算子の使い方には

sizeof 演算子の使い方:

(1) sizeof(型の名前)

(2) sizeof(変数の名前)

と 2 通りの方法があり、前者は、例えば sizeof(char) の様に書くと char 型の変数がメモリ空間内で使うデータサイズ( byte )が得られます。
また後者は、char a を定義してから sizeof(a) の様に書くと char 型の変数 a ひとつがメモリ空間内で使用するデータサイズ( byte )が得られます。

なお、あるデータ型が何バイト分のデータになるのかは大体は規格で決まっているのですが、CPUとかOSとかの違いによって微妙に異なる場合があるのでプログラマは注意する必要があります(※)。

※ 例えば int 型とか long 型とかは OS が 32 bit か 64 bit かによって 32 bit だったり 64 bit だったりするので 20 世紀終わりから 21 世紀初頭にかけて大問題になっていました。


2. アドレス演算子で変数が置いてある場所(アドレス)を調べる

ある変数のデータサイズ(byte)は sizeof 演算子で得られますので、次はその変数がメモリ空間内のどの場所に配置されているのか「アドレス演算子」を使って調べてみましょう。

アドレス演算子の使い方:

&変数名

のように変数の前に付けた「&」の事をアドレス演算子と呼んで、その変数のアドレスを得るために使えます。
例えば char a を定義してから &a の様に書くと char 型の変数 a のアドレスが得られます。

なお、ある変数のアドレスがいくつになるのかはシステム(OSとかライブラリ等)が自動的に決めてくれますので、普段はプログラマは気にする必要がありません(※1)。

またアドレスの桁数はメモリ空間の広さ、つまりメモリの最大サイズを表していて、例えばアドレスの桁数が(16進数で) 2 桁 ならばアドレスの範囲は「0x00 番地 〜 0xFF 番地」となるので最大メモリサイズは 255 byte となります。
実際のコンピュータのアドレスの桁数はやはりCPUとかOSとかの違いによって変わりますが、一般的に 64 bit OS なら桁数は 16 桁、アドレスの範囲は「0x0000000000000000 番地 〜 0xFFFFFFFFFFFFFFFF番地」、最大メモリサイズは 16777216 TiB = 18446744073709551616 byteとなります(※2)。

※1 ただしデバッグ時は気にしないといけない状況が結構あります。

※2 あくまで理論サイズで、コンピュータに実際に載せられる物理的なメモリサイズは色々な制約からずっと少ないです。もし興味があれば「仮想メモリ」についてもネットで調べてみると良いでしょう。