プログラマ ずんべ の日記

zunbe

プログラマ ずんべ の日記
プログラマ ずんべ の日記

探し物は見つかりましたか? サイト内検索を試してください。

演算の優先順位と評価順序 演算の優先順位と評価順序 gotoを使おう gotoを使おう

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


コメント

コメントしてください






保存しますか?


スパム対策:
この入力フィールドに「10」と入力してください。


プログラマ ずんべ の日記:ずばヒット アマゾン