1

ベースコード:

        char *args[3] = {NULL};
        args[0] = "ls";
        args[1] = "-l";
        args[2] = NULL;

なぜだろう:

        int execution = execlp("ls", args[0], args[1], NULL);

警告なし、および :

        int execution = execlp("ls", args[0], args[1], args[2]);

警告の原因:関数呼び出しにセンチネルがありませんか?

注:両方が同じであることは理解していますが、なぜ一方が警告を発し、もう一方が警告を発しないのかについて興味があります。

4

2 に答える 2

4

なぜならThe list of arguments must be terminated by a NULL pointerargs[2]たまたまあなたのケースにあったとしてもNULL、コンパイラーにはその洞察がありません(あなたが私に尋ねても、そうすべきではありません)。

誰かがやって来て、args[2]それがセンチネルとして使用されていることを知らずに別のものに変更されたらどうしますか?

于 2013-01-01T23:08:41.693 に答える
0

コンパイラは知的ではないからです。

センチネルはリテラルの0or NULL(実際には0orのみ(void *)0) であると予想され、それ以外の場合は警告が生成されます。コンパイラがより賢く、コードに対してさらに静的分析を実行した場合、それargs[2]は実際には定数 0 であると結論付けることができたので、警告は必要ありませんが、明らかにそうではありませんでした。

于 2013-01-01T23:08:32.590 に答える