[英]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.