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



基本代码:

        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]是哨兵的情况下,把它改成了别的东西怎么办?

因为编译器不是智能的

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

最新更新