我正在编写一个使用 fork 和 execv 替代项目中的 system() 和 popen() 的函数。
我发现虽然 execv 不会更改命令数组的内容,但它将其第二个参数声明为char * const argv[],这实际上可以更改 char* 的内容。因此,我决定像这样声明我的函数:int execute_cmd(const char* const cmd[])
,既使指向 char 的指针是 const,也使 const 指针所指向的内容是 const(对不起,我知道这种状态很令人困惑,但我尽力了)。
然而,当我以这种方式调用它时:
void execute_cmd(const char* const cmd[])
{
for (int i = 0; cmd[i]; i++)
{
printf("%s ", cmd[i]);
}
}
int main()
{
char* const cmd[] = {"ls", "-al", 0};
execute_cmd(cmd);
return 0;
}
出现了编译错误,提示如下:
test.c:21: 警告: 从不兼容的指针类型传递参数 1 给 ‘execute_cmd’
test.c:10: 注意: 预期 ‘const char * const*’ 类型的参数,但实参的类型是 ‘char * const*’
我想知道为什么会发生这种情况,因为在我的看法中,带有 const 的形式参数可以将非 const 变量作为其实际参数,例如:
void printInt(const int);
//which can call like this
int a=10;
printInt(a);
我认为用非常量变量初始化常量变量是非常常见的,那么这个函数为什么可以工作,但我的execute_cmd()却没有工作?我是否忽略了一些重要的内容?这个const有关吗?
我搜索了"char * const * and const char* const *" 以及 "const formal argument with non-const actual parameter" 这样的东西,但没有得到很有用的东西。如果有人能给出一个关于这个问题的正确关键字,我也将不胜感激。
我不是一个英语母语者,所以如果有语法问题,请原谅我。
char * const cmd[]
,我写错了。 - Ericchar* const cmd[] = {ls_string.c_str(), al_string.c_str(), 0}
这样初始化时,不会起作用,因为c_str()返回一个const char*。 - Ericchar **
和char * const *
之间的区别将使得示例中的步骤4无法更改const
指针。 - Eric