2005/07/17
C言語の初心者に多い間違いに、NULLと空文字列の混同がある。
たとえば、こんなコードがある(最近はこんな関数、めっきり使わなくなったけど)。
-----
char drive[_MAX_PATH];
char path[_MAX_PATH];
char fname[_MAX_PATH];
char ename[_MAX_PATH];
_splitpath("C:\HOGE.txt",drive,path,fname, ename):
-----
_splitpathという関数は、取得する drive、path、fname、ename のうち、取得する必要の無いパラメータには、NULLを渡す事ができる。
ファイル名と拡張子だけが欲しい場合、以下の様に記述する。
-----
char fname[_MAX_PATH];
char ename[_MAX_PATH];
_splitpath("C:\HOGE.txt",NULL,NULL,fname, ename):
-----
これを、初心者は以下の様に記述してしまう。
-----
char fname[_MAX_PATH];
char ename[_MAX_PATH];
_splitpath("C:\HOGE.txt","","",fname, ename):
-----
これは明らかに間違いである。
_splitpath に、メモリ領域のポインタが渡ってしまうので、_splitpath は、ドライブ名とパスを引数で渡されたポインタに入れようとし、結果、メモリ領域内が破壊される。
このコードを書いた初心者に「その引数には、NULLを渡さないとダメだよ」と教えても、「だから、ヌルを渡してるじゃないですか」とのたまう。
確かにわかりにくい概念ではあるとは思うが、「ポインタに何が入っているか」を考えれば、_splitpathに「""」を渡したら、関数側の処理で判断できない事くらいわかりそうなもんだ。
投稿者 zunbe : 2005/07/17 01:06:35
|