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



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

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

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

意思是我应该写const char *

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

为什么?

因为…argv[]不是const。它当然不是一个(静态)字符串字面值,因为它是在运行时创建的。

你声明了一个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++ - 0 test test.cc

。/测试hoo

输出:

foo

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

历史原因

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

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

总是非法的,因为不允许这样乱搞字符串字面值,所以指针应该指向const char。

为什么在将char*赋值给字符串

时要求它为常量?

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

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

无论如何,你为什么不用std::string代替呢?(你好像在用c++)

如果你看一下像execve这样的执行函数,你会发现它们实际上不接受const char*作为参数,但确实需要char*,因此你不能使用字符串常量来调用main

最新更新