当我编写以下代码并执行它时,编译器说
已弃用从字符串常量转换为
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[]
。
为什么?
答案 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
。