トラック5・📦変数・型・演算子

sizeofとメモリ上のサイズ

読む目安 約11分・ゴール:sizeofで型と変数のバイト数を測り、型ごとに箱の大きさが違うことを実感できる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

変数は箱だと言ってきました。ここでは、その箱の大きさをバイト単位で測る方法を覚えます。測れるようになると、メモリという場所が急に現実味を帯びてきます。

sizeof は演算子

#include <stdio.h>

int main(void) {
    printf("char   %zu バイト\n", sizeof(char));
    printf("int    %zu バイト\n", sizeof(int));
    printf("double %zu バイト\n", sizeof(double));
    printf("bool   %zu バイト\n", sizeof(bool));
    return 0;
}

一般的な64ビット環境では 1 / 4 / 8 / 1 と出ます。sizeof は関数ではなく演算子で、sizeof(型名) でも sizeof 変数 でも書けます。結果は size_t という専用の型なので、書式指定子は %zu を使います。

char が1バイトであることだけは規格で保証されています。他のサイズは環境次第です。「たぶん4」ではなく「測れば分かる」と考えてください。

変数のサイズも測れる

#include <stdio.h>

int main(void) {
    int    kosuu = 3;
    double kingaku = 1980.0;
    char   kigou = 'A';

    printf("%zu %zu %zu\n", sizeof kosuu, sizeof kingaku, sizeof kigou);
    printf("合計 %zu バイト\n", sizeof kosuu + sizeof kingaku + sizeof kigou);
    return 0;
}

出力は 4 8 1 と 合計 13 バイト。3つの箱がメモリに並んで積まれている——最初のトピックのビジュアライザで見た図の、実寸がこれです。

なぜサイズが大事なのか

・入れられる値の範囲が決まる(4バイト=約 ±21億)
・大量のデータを扱うとき、必要なメモリ量を計算できる
・ポインタで1つ進むと何バイト進むかが、このサイズで決まる(トラック12)

3つ目が本命です。今は「型ごとに箱の大きさが違う」という事実だけ、体に入れておいてください。

罠・注意

sizeof('A') は 1 ではない。 Cでは文字定数の型が int なので、多くの環境で 4 になります。sizeof(char) は1、sizeof('A') は4。C++とは違う、Cならではの動きです。

%d で表示しない。 サイズは size_t 型なので %zu が正解です。%d でも動いて見えることがありますが、正しくありません。

sizeof の中身は実行されない。 sizeof(n++) と書いても n は増えません。大きさを調べるだけで、式そのものは評価されないからです。

ポインタ姫バイト数とは、番地と番地の距離ですわ。この距離を知る者だけが、メモリの中を正しく歩けるのです。

まとめ

sizeof は型や変数が占めるバイト数を返す演算子で、表示は %zu。char は必ず1、int は4・double は8が一般的です。文字定数 'A' は int 扱いでサイズが4になる点に注意。このサイズの感覚が、ポインタを学ぶときの前提になります。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

sizeof が返すものはどれですか。

  1. 変数に入っている値
  2. 型や変数がメモリで占めるバイト数
  3. 変数の桁数
  4. 使えるメモリの残量
答えを見る

正解:B(型や変数がメモリで占めるバイト数)

sizeof は「その型(変数)がメモリで何バイト使うか」を返す演算子です。結果は size_t 型なので、表示には %zu を使います。char は必ず1バイト、int は4・double は8が一般的です。このサイズの感覚が、のちのポインタ演算の前提になります。

確認問題 2

一般的な64ビット環境での出力はどれですか(/は改行を表します)。

#include <stdio.h>

int main(void) {
    char c = 'A';
    double x = 1.5;
    printf("%zu %zu\n", sizeof(c), sizeof('A'));
    printf("%zu\n", sizeof(x));
    return 0;
}
  1. 1 1/8
  2. 1 4/8
  3. 4 4/8
  4. 1 4/4
答えを見る

正解:B(1 4/8)

sizeof(c) は char の変数なので 1。ところが sizeof('A') は 4 です。Cでは文字定数 'A' の型が char ではなく int だからです(C++では1になるので、混同しやすいところ)。double は8バイトなので最後は 8。「char なら常に1」と早合点しないための問題です。

「変数・型・演算子」の目次

  1. 変数とは名前付きの箱
  2. int型と整数の世界
  3. 浮動小数点数 float / double
  4. char型と文字コード
  5. bool型と真偽——C23標準の書き方
  6. 定数——const と constexpr
  7. 算術演算子と優先順位
  8. 整数の割り算と剰余の罠
  9. 型変換——暗黙と明示
  10. 2進数・16進数リテラル(0b / 0x / 桁区切り')
  11. sizeofとメモリ上のサイズ
  12. オーバーフローという事件

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版