sizeof演算子の引数にポインタを指定するな。

ドハマりしました。

タイトルの通りです。
原稿はどうしたって? 知らない子です。依頼でひっさしぶりにC言語とかいう原点かつ頂点みたいなプログラミング言語を使う機会がありました。非常に苦い思いをしたので備忘録として残します。

タイトルの通りです。

普段はメモリをあまり意識しなくてもいい言語ばっかり使っているので、雰囲気で横展開とかでいけない? いや、いけるでしょ。よゆーよゆーと安易にchar型のポインタを引数に指定。
それが地獄の始まりだったことをいさくらはまだ知らない。
あの不具合の名前を僕たちはまだ知らない。(あの花、いいよね。私はぽっぽが好きよ。みんな、ぽっぽは良いやつなんだよ。頼むよ。救ってやってくれよ)
いきなり、アニメの話するのやめません? 筆が乗っているのでこのまま突っ走ります。

不具合概要。

たぶんこれはアーキテクチャによって異なると思うんですが、私の環境ではsizeofの引数にchar型のポインタを指定すると、『4』が返ってきます。
ポインタの指している先が、10文字だろうと、20文字だろうと4です。
勉強になりました。

誤用例
/* 変更できないメソッド */
void methodX(char *src, int size)
{
    char otegami[256]={"TANI KUDASAI"};

    /***************/
    /* コピーするよ */
    /***************/
    memcpy( src , otegami, size );
}

/* 自作メソッド */
void methodA()
{
    /***************/
    /* 変数宣言だよ */
    /***************/
    char *kyozyuhe = &グローバル変数[0];

    /*************/
    /* なんか処理 */
    /*************/
    methodX( kyozuhe, sizeof(kyozuhe) );
}
正用例
/* 変更できないメソッド */
void methodX(char *src, int size)
{
    char otegami[256]={"TANI KUDASAI"};

    /***************/
    /* コピーするよ */
    /***************/
    memcpy( src , otegami, size );
}

/* 自作メソッド */
void methodA()
{
    /***************/
    /* 変数宣言だよ */
    /***************/
    char *kyozyuhe = &グローバル変数[0];

    /*************/
    /* なんか処理 */
    /*************/
    methodX( kyozuhe, sizeof(グローバル変数) );
}

ってことで、sizeofには実態を入れましょうって話でした。お疲れさまでした。
私は樹海に潜ります。探さないでください。

コメント

タイトルとURLをコピーしました