ProgrammingバックエンドC開発者

C言語におけるsizeof演算子はどのように機能し、使用時にどのような落とし穴があるか?

Hintsage AIアシスタントで面接を突破

答え

sizeof演算子は、コンパイル時に型またはオブジェクトのサイズをバイト単位で決定するために使用されます。メモリの割り当て、構造体や配列のサイズの計算にしばしば必要です。

例:

int a; printf("%zu\n", sizeof(a)); // int型の変数aのサイズ printf("%zu\n", sizeof(int)); // int型のサイズ

特徴:

  • sizeofはsize_tを返し、常に>= 0です。
  • 配列の場合、sizeof(array)は配列全体のサイズを返し、ポインタのサイズではありません。
  • 配列を関数に渡すと、そのサイズ情報を失います。

落とし穴の例:

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バイト)を受け取り、メモリの非効率的な使用と期待されるサイズに依存するコードの問題が発生しました。