組み込みC/C++

C/C++リテラシー向上のためのページ

ポインタでやってしまうミス②

一番基本的なミスを切り取っておこうかと思います。

 

Pattern 3

#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[ ])
{
    int *bar ;
    
    *bar = 100;
    
    return 0;
}

ローカルでポインタを宣言しています。その時点ではアドレスを入れる箱があるだけで、ポインタの値(bar)は不定値です。どこを指しているか判りません。不明であるポインタの指す先に値を代入してしまっているのがこのプログラムです。このミスは実はとても怖く不定値であるポインタの先はもう既にほかの変数が割り当てられている可能性があります。そのくせエラーにはなりませんから堂々と領域破壊が起こり思わぬところでバグが表出する事になります(担当外の機能でバグが出てほかの人がバグを疑われます)このプログラムのように宣言と代入が近い位置にあればいいのですが離れてたりすると初期化されているものと思い込み領域破壊の原因が見つからなかったりします。出来るだけ宣言時初期化をする事を心がけると良いかと思います。ところでローカル変数だと中身が不定値になりますがグローバル変数だとほとんどの処理系ではNULLとなります。そのため代入でエラーとなりますので、もう少しミスに気づきやすくなるかと思います。初心者のいるプロジェクトではよく注意してあげると良いかと思います。