K&R C言語 入門その3

こんにちは、童爺です。
入門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言語プログラマーにとってバイブルの様なものなので、一冊持っておいた方が良いでしょう。
内容は、初心者向けではないので他の本である程度マスターしてから読むと良いでしょう。


それではまた。
でわでわ。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

童爺 童爺のプロフィール
童爺は「どうじ」と読んでください。 由来は友人に、ハンドルネームを「酒呑童子」にしようかと相談したら、「酒呑童爺」にしたらどうかと言われたのが由来です。(爺むさい所や、子供っぽいところがあるからです。)