【发布时间】:2020-11-03 12:35:25
【问题描述】:
我正在编写一个函数,使用 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: 警告:从'execute_cmd' 传递参数 1 指针类型不兼容
test.c:10:注意:预期为“const char * const*”,但参数为 输入‘char * const*’
我想知道为什么会发生这种情况,因为 IMO 带有 const 的形式参数可以将非常量变量作为实际参数,例如:
void printInt(const int);
//which can call like this
int a=10;
printInt(a);
而且我认为用非常量变量初始化 const 变量是很常见的,那么为什么这个函数有效但我的 execute_cmd() 没有呢?我错过了 const 的重要内容吗? 我搜索了“char * const * and const char* const *”和“带有非 const 实际参数的 const 形式参数”这样的东西,但没有得到非常有用的东西,如果有人能给我一个想法,我也将不胜感激这个问题的正确关键工作。 我不是以英语为母语的,所以如果有语法问题请见谅。
【问题讨论】:
-
试试
char * const cmd[] = {"ls", "-al", 0}; -
"这实际上可以改变char*的内容" --> 代码不应试图改变
"ls"等 -
@chux-ReinstateMonica 是的,是
char * const cmd[],我写错了 -
您将顶级
const(例如const int)与指向对象(例如char const*)上的const混淆了。相对于指针星号的位置至关重要。正确的是,您不能只将一个表示它不会修改指向对象的指针传递给一个声明自己采用可能的指针的函数。剩下的只是如何解决糟糕的const-API 或 C 本身的正确性问题。 -
@chux-ReinstateMonica 发布了最小化代码可能会导致问题。和真正的 gcc 的消息
标签: c