トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> C/C++な話題 >> 意外と知らないsizeof()関数の豆知識

意外と知らないsizeof()関数の豆知識 (C言語)

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での場合) 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)にするべきですね☆
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。