execvp和参数类型 - ansi c

时间:2012-10-18 18:13:50

标签: c strtok argv execvp

我在使用execvp()时遇到问题。 execvp()期望类型 char * const * 作为第二个参数。我想解析传递给应用程序的参数(在argv中)并创建该类型的数组。例如,用户正在调用二进制文件,如下所示:

./myapp "ls -a -l"

然后我从中创建以下数组:

{"ls", "-a", "-l", NULL}

现在,我的代码如下:

    const char* p[10];
    char temp[255] = "ls -a -l";

    p[0] = strtok(temp, " ");
    for(i=0; i<9; i++) {
        if( p[i] != NULL ) {
            p[i+1] = strtok(NULL, " ");
        } else {
            break;
        }
    }

它有效,但我收到了警告:

main.c:47: warning: passing argument 2 of ‘execvp’ from incompatible pointer type /usr/include/unistd.h:573: note: expected ‘char * const*’ but argument is of type ‘const char **’

如何做到正确

2 个答案:

答案 0 :(得分:4)

问题是execvp的第二个参数是char * const *,它是“指向非常数数据的常量指针的指针”。你试图传递一个const char **,这是一个“指向常量数据的指针”。

解决此问题的方法是使用char **而不是const char **(因为“指向X的指针”始终允许转换为“指向const X”的指针,对于任何输入X(但指针的顶级):

char* p[10];
p[0] = ...;
// etc.

请注意,如果您确实需要插入const char *个参数,只要不修改它们,就可以强制转换它们char *。虽然exec*函数族的参数被声明为非const,但它们不会修改它们(参见POSIX 2008 specification)。其中的基本原理解释了为什么它们被声明为非const

答案 1 :(得分:4)

您可以使用char *p[10]

要将其分解:char *const *p表示“指向非常量字符的常量指针的非常量指针” - 也就是说,p是可写的,p[0]是不可写的,{{1是可写的。