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のサイズは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)にするべきですね☆