繁体   English   中英

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

[英]Why is main() argument argv of type char*[] rather than const char*[]?

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

不推荐将字符串常量转换为char*

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

这意味着我应该写const char *

但是当我们使用char* argv[]将 arguments 传递给main时,我们const char* argv[]

为什么?

历史原因。 更改 main() 的签名会破坏太多现有代码。 并且有可能某些实现允许您从代码中将参数更改为 main。 然而这样的代码:

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

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

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

您正在声明一个char *指针,然后为其分配一个字符串文字,根据定义,它是常量; 实际数据在只读 memory 中。

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 呼

Output:

这不是对您为什么要更改argv的评论,但这当然是可能的。

为什么在将 char* 分配给字符串时需要保持不变

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM