execvp和参数类型-ANSI C

mar*_*xin 5 c strtok execvp argv

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

./myapp "ls -a -l"
Run Code Online (Sandbox Code Playgroud)

然后我从中制作以下数组:

{"ls", "-a", "-l", NULL}
Run Code Online (Sandbox Code Playgroud)

现在,我的代码如下所示:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但是我得到警告:

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 **’

如何正确做?

nne*_*neo 4

你可以只使用char *p[10].

分解一下:char *const *p意思是“指向非常量字符的常量指针的非常量指针”——也就是说,p可写p[0]、不可写和p[0][0]可写。

  • 是的。根据 POSIX 2008 规范,“exec”函数都不会写入字符串;`char *const*` 用于兼容性(而不是更正确的 `const char *const*`)。 (3认同)