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

时间:2011-04-27 18:20:43

标签: c++ main

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

  

已弃用从字符串常量转换为char*

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

这意味着我应该写const char *

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

为什么?

5 个答案:

答案 0 :(得分:9)

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

char * p = "helllo";
* p = 'x';

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

答案 1 :(得分: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;
}

输入:

  

g ++ -o test test.cc

     

./ test hoo

输出:

  

FOO

这不是对为什么你想要改变argv的评论,但肯定是可能的。

答案 2 :(得分:2)

  

为什么char *在分配给字符串

时必须是常量

因为此类文字字符串(如"hi""hello what's going on"等)存储在您的exe的只读段中。因此,指向它们的指针需要指向常量字符(例如,不能更改它们)。

答案 3 :(得分:1)

您正在为指向非常量字符串(const char*)的指针分配字符串常量(char *p)。这将允许您修改字符串常量,例如通过p[0] = 'n'

无论如何,为什么不使用std::string呢? (你似乎在使用C ++)。

答案 4 :(得分:1)

如果您查看execve等执行函数,您会发现它们实际上不接受const char*作为参数,但确实需要char*,因此您无法使用一个字符串常量来调用main