こんにちは、童爺です。
入門3日目です。
張り切っていきましょう。
今日も下図のK&R プログラミング言語Cを元に解説していきたいと思います。
前回は3章までだったので、今回は4章から始めたいと思います。
NULLについて
参考書の125ページに、「ポインタを整数~今後われわれはNULLを使うこととする。」の一文から、NULLは0と思い込んでいる人が多いと思いますが、正確には以下の様になっています。
#define NULL ((void *)0)
つまり、NULLは0では無く、0と言う値が入ったポインタと言うのが正解です。
そこを気をつけないと、痛い目を見る可能性があります。
例えば、以下の様なコーディングの場合。
#include <stdio.h> void foo(const char *, char *); int main(int argc, char *argv[]) { int i; if(argc <= 1){ foo("NG",0); return -1; } for(i = 1; i < argc; i++){ foo("OK", argv[i]); } return 0; } void foo(const char *str, char *argv) { if(argv == NULL){ printf("%s, argv is NULL\n", str); }else{ printf("%s %s\n", str, argv); } }
argc(引数)が1以下の場合fooに対して、argvに0を設定していますが、0はリテラルなのでint(32bit)に変換され、ポインタ(64ビット)に渡されます。
すなわち、渡される引数のサイズが違うため、最悪Segmentation faultエラーを引き起こす可能性があります。
但し、最近のコンパイラーは、自動的に64bitに変換してくれるものもあるようなので、エラーが発生しない可能性があるのですが、ここはfoo(“NG”, NULL);とした方が、作法的には正しいです。
古いプログラマーの方は、NULLは0だろうと古い考えを持っている人が多いので要注意です。
ちなみに、#define NULL ((void *)0)と宣言しているのは、/usr/include/check.hに宣言されています。
まとめ
以上で、K&R プログラミング言語Cに関する注意点は終わりです。
後は、特に特筆すべき点はありません。
あえて言えば、翻訳ミスがちょこちょこあるなと言った具合ですが、ネットで検索すれば出てくるので、特にここで記述しません。
K&R プログラミング言語Cは、C言語プログラマーにとってバイブルの様なものなので、一冊持っておいた方が良いでしょう。
内容は、初心者向けではないので他の本である程度マスターしてから読むと良いでしょう。
それではまた。
でわでわ。