基本代码:
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?
注意:我知道两者都是一样的,但我只是好奇为什么一个引起警告而不是另一个。
答案 0 :(得分:4)
因为The list of arguments must be terminated by a NULL pointer
。尽管在你的情况下args[2]
碰巧是NULL
,但编译器没有这种洞察力(如果你问我,也不应该这样)。
如果有人出现并将args[2]
更改为其他内容,而不知道它被用作哨兵会怎样?
答案 1 :(得分:0)
因为编译器不是智能的。
它希望标记为文字0
或NULL
(实际上只是0
或(void *)0
),其他任何内容都会生成警告。如果编译器更聪明并且它对代码执行了更多的静态分析,那么可以得出结论args[2]
确实是常数0,因此不需要警告,但显然它不能。