2005/07/15
C言語には「配列名」というものがある。
これが、いわゆる「変数名」と違うという事を知っているプログラムは意外に少ない。
「配列名」は変数ではない。実行時にローカルに定まる定数である。
変数ではないのだから、値を代入する事はできない。
たとえば、以下の様な事はできない。
-----
char a[2];
a = NULL;
-----
実際、配列名 a には、メモリは割り当てられていない。
スタックの積まれ方を見ればわかる。
コードの記述の通り、メモリは2バイトしか確保されない。
配列名 a そのものに対する記憶領域は存在しないのである。
残念な事に、最近のCコンパイラでは、以下の様なコードを書いても、警告もエラーも出ない。
-----
char a[256];
sprintf("%s", &a);
-----
しかしながら、このコードは明らかに間違いである。
配列名 a には記憶領域がないのであるから、そのアドレスを求める事はできないはずだ。
正しくは、以下の様にコードを記述するべきである。
-----
char a[256];
sprintf("%s", &a[0]);
sprintf("%s", a);
-----
「&a」というコードについては、まぁ、意味はわかるので、そう目くじらを立てる事でもないとは思うが、問題は、本来の仕組みを知らずにプログラマを組んでいるプログラマが多いことである。
最近は、Visual Basicなどの便利な言語があるので、こういった細かい話はどうでもよくなりつつあるが、若いプログラマは、アセンブラやC言語をきちんと勉強して、こういった基本的な動作を知ってほしいと思う。
投稿者 zunbe : 2005/07/15 16:33:46
|