为什么main()参数argv的类型为char*[]而不是const char*[]?

Fru*_*der 24 c++ program-entry-point

当我编写以下代码并执行它时,编译器说

不推荐使用从字符串常量转换为 char*

int main()  
{  
  char *p;  
  p=new char[5];  
  p="how are you";  
  cout<< p;  
  return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

这意味着我应该写const char *.

但是当我们将参数传递给main使用时,char* argv[]我们不会const char* argv[].

为什么?

小智 9

历史原因.更改main()的签名会破坏过多的现有代码.有些实现可能允许您从代码中将参数更改为main.但是像这样的代码:

char * p = "helllo";
* p = 'x';
Run Code Online (Sandbox Code Playgroud)

总是非法的,因为不允许你像这样乱用字符串文字,所以指针应该是一个const char.

  • 但那不是原因.重写`argv []`是一种常用技巧.如果您接受任何敏感数据作为参数,则实际上是必需的.因此,原因不是历史性的,如果你不能这样做,那就没有任何意义. (4认同)

Bri*_*ach 7

因为...... argv[]不是常数.它肯定不是(静态)字符串文字,因为它是在运行时创建的.

你正在声明一个 char *指针然后为它分配一个字符串文字,根据定义它是常量; 实际数据在只读存储器中.

int main(int argc, char **argv)  {
    // Yes, I know I'm not checking anything - just a demo
    argv[1][0] = 'f';
    std::cout << argv[1] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输入:

g ++ -o test test.cc

./test hoo

输出:

FOO

这不是对你想要改变的原因的评论argv,但它肯定是可能的.

  • 如果您接受任何敏感数据作为程序参数,则需要更改“ argv”。 (2认同)