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 pointer. 即使args[2]碰巧NULL在您的情况下,编译器也没有这种洞察力(如果您问我,也不应该)。

如果有人出现并改变args[2]了其他东西,却不知道它被用作哨兵怎么办?

于 2013-01-01T23:08:41.693 回答
0

因为编译器不智能。

它期望哨兵是文字0NULL(实际上只是0(void *)0),其他任何东西都会产生警告。如果编译器更聪明并且它对代码执行了更多的静态分析,它可能会得出结论args[2]确实是一个常量 0,所以不需要警告,但显然它不能。

于 2013-01-01T23:08:32.590 回答