当我编写下面的代码并执行它时,编译器说
已弃用从字符串常量到
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
。