为什么我会收到失踪的哨兵警告?

时间:2013-01-01 23:05:59

标签: c++ operating-system exec fork

基本代码:

        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]);

导致警告:在函数调用中缺少sentinel?

注意:我知道两者都是一样的,但我只是好奇为什么一个引起警告而不是另一个。

2 个答案:

答案 0 :(得分:4)

因为The list of arguments must be terminated by a NULL pointer。尽管在你的情况下args[2]碰巧是NULL,但编译器没有这种洞察力(如果你问我,也不应该这样)。

如果有人出现并将args[2]更改为其他内容,而不知道它被用作哨兵会怎样?

答案 1 :(得分:0)

因为编译器不是智能的。

它希望标记为文字0NULL(实际上只是0(void *)0),其他任何内容都会生成警告。如果编译器更聪明并且它对代码执行了更多的静态分析,那么可以得出结论args[2]确实是常数0,因此不需要警告,但显然它不能。