sizeof演算子は、コンパイル時に型またはオブジェクトのサイズをバイト単位で決定するために使用されます。メモリの割り当て、構造体や配列のサイズの計算にしばしば必要です。
例:
int a; printf("%zu\n", sizeof(a)); // int型の変数aのサイズ printf("%zu\n", sizeof(int)); // int型のサイズ
特徴:
落とし穴の例:
void foo(int arr[]) { printf("%zu\n", sizeof(arr)); // 配列ではなくポインタのサイズを表示! } int arr[10]; foo(arr); // sizeof(arr) == 40 (通常)、sizeof(arrはfooのレベル) == 8 (通常)
C言語におけるsizeof('a')の結果は何ですか?
答え: 'a'はcharのように見えますが、sizeof('a')の結果はint型のサイズになります。C言語の文字定数はintです。
例:
sizeof('a') // 通常は4、1ではない
物語
malloc(strlen(str) * sizeof(char))とし、ヌル文字を考慮しませんでした。これにより、最後のバイトが失われ、文字列処理の標準ライブラリ関数を使用する際にバグが発生しました。物語
sizeof(arr)を使い、全構造体のサイズを期待しましたが、ポインタのサイズだけを得ました。その結果、メモリに非常に少ないデータが書き込まれ、ヒープの破損を引き起こしました。物語
開発者は1バイトのメモリを割り当てるためにsizeof('a')を使用することに決めましたが、4バイト(または8バイト)を受け取り、メモリの非効率的な使用と期待されるサイズに依存するコードの問題が発生しました。