基本代码:
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]);
导致警告:在函数调用中缺少哨兵?
注意:我知道两者是相同的,但我只是好奇为什么一个引起警告,而不是另一个。
因为The list of arguments must be terminated by a NULL pointer
。即使args[2]
在你的例子中恰好是NULL
,编译器也没有这种洞察力(如果你问我的话,它也不应该有这种洞察力)。
如果有人在不知道args[2]
是哨兵的情况下,把它改成了别的东西怎么办?
因为编译器不是智能的
它期望哨兵是字面量0
或NULL
(实际上只是0
或(void *)0
),其他任何内容都会生成警告。如果编译器更聪明一些,对代码执行更多的静态分析,它就可以得出结论,args[2]
确实是一个常数0,因此不需要警告,但显然它不能。