TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【C言語】sizeof関数の豆知識

C言語のsizeof関数について説明します。

まずは、以下のコードを見てください。
#include <stdio.h> int main(void) { char str[] = "ABCDE"; char c = 'A'; char *p = str; printf("%d %d\n", sizeof(c), sizeof('A')); printf("%d %d %d\n", sizeof(str), sizeof(p), sizeof("ABCDE")); return 0; }
実行結果)32bitPCでの場合 C言語のsizeof関数 これをみると、変数cのサイズは1byte、文字'A'のサイズは4byteとなっています。 なかなかにビックリな結果ですが、種明かしをするとC言語の文字定数はint型です。 つまり、 sizeof('A')の値は、sizeof(char)と等しいのではなく、sizeof(int)の値と等しい という事です Σ( ̄□ ̄lll)ガビーン 例えば、
if (getch() == 'A') { ... }
の様なコードを良く見かけますが、getch()の戻り値はint型です。 文字列定数がint型であるからこそ、成り立つコードだという訳ですね^^;) また、sizeof(配列)、sizeof(文字列)は、配列 及び 文字列のサイズをそれぞれ返します。 しかし、sizeof(ポインタ)の場合は、ポインタが指しているデータ型が何であれ、ポインタ自体のサイズを返します。 そして、理論上ではsizeof(ポインタ)の値は、sizeof(int)の値と等しくsizeof(int)の値は、CPUレジスタのサイズと等しくなる事が定められています。 (ex 32bitCPUならば、sizeof(int)は4 (32bit = 4byte) を返します) ただ、昨今登場した64bitCPUに関しては、コンパイラが32bitにしか対応していない可能性もあり、その限りではないです・・・。 ところで、malloc, callocを使ってchar型配列のメモリを確保する場合、以下の様なコードを書く人がいます。
char str[] = "hogehoge"; char * p = (char *)malloc( (strlen(str) + 1) * sizeof(char) ); strcpy(p, str);
もちろん間違いではありませんが、この場合の「sizeof(char)」は、単純に「1」に置き換えても大丈夫です。 (∵sizeof(char)は1である事が約束されているから) しかし、VC++特有のTCHAR型配列のメモリを確保する場合等は、間違いなくsizeof(TCHAR)にするべきですね☆
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ