[ C言語 ] sizeof と ポインタ演算のありがちな間違い

Pocket

ここでは、C言語初心者がやらかしてしまいそうな間違いを紹介しています。気をつけましょう。

スポンサーリンク


sizeof のありがちな間違い

C言語を使い出したときに、やってしまいそうな(やってしまった)間違いです。sizeof 演算子でありがちな間違いを紹介します。サンプル内のコメントも参照ください。

#include <stdio.h>

int main(int argc, char** argv)
{
    char buf[32];

    // この時点では buf は char 型の要素数 32 の配列であることを認識している
    printf("buf size = %d\n", sizeof(buf));

    func(buf);
}

int func(char* buf)
{
    // この関数内では buf は char* 型
    printf("buf size = %d\n", sizeof(buf));
}

実行結果

実行結果は次のようになります。なお、char* 型のサイズは32ビットOSであれば4バイトですが、64ビットOSでは8バイトになります。

gcc sizeof.c

./a.out
buf size = 32
buf size = 4

おまけ

sizeof(void*) は4バイトまたは8バイトとなりますが、sizeof(void) の結果は 1 となりました。void 型のサイズを取得する必要はないと思いますので、タイプミスには気をつけようというお話です。

ポインタ演算の順序

次は演算子の優先度によるありがちな間違いです。どこに問題あるかわかるでしょうか?

int _count_up_number(int* pnumber)
{
    // ポインタの内容をカウントアップする(誤)
    *pnumber++;
    
    // カウントアップした値をリターン
    // 無茶苦茶な値がリターンされる
    return *pnumber;
}

ポインタの指すアドレスを1つずらしているだけになっています。期待するポインタの指す値のインクリメントは行われていません。演算子の優先度によるバグは発見しにくいので気を付けたいものです。正しくは以下のように記述します。

int _count_up_number(int* pnumber)
{
    // ポインタの内容をカウントアップする(正)
    (*pnumber)++;
    
    // カウントアップした値をリターン
    return *pnumber;
}
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>