我在使用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 **’
如何做到正确?
答案 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是可写的。