当我编写并执行以下代码时,编译器报错:
从字符串常量转换为
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 []
。
为什么?
当我编写并执行以下代码时,编译器报错:
从字符串常量转换为
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++ -o test test.cc
./test hoo
输出:
foo
这并不是关于为什么你要更改argv
的评论,但这确实是可能的。
argv
。 - Šimon Tóth出于历史原因,更改main()的签名将破坏太多现有代码。而且有可能某些实现允许您从代码中更改main的参数。但是像这样的代码:
char * p = "helllo";
* p = 'x';
这总是不合法的,因为您不允许像那样操纵字符串文字,因此指针应该是指向const char。
main()
的理解是错误的。main()
不能仅通过字符串常量来调用,因此参数没有必要加上 const
。请参考我的回答。 - Šimon Tóthargv[]
是一种常见技巧。如果你接受任何敏感数据作为参数,则实际上需要这样做。因此,原因并不是历史原因,如果不能这样做,就毫无意义。 - Šimon Tóthargv
是否保证原始数据不会通过 procfs 或其他机制可见? - Greg Nisbetconst char*
)赋值给一个非常量字符串指针(char *p
)。这将允许你修改字符串常量,例如通过执行p[0] = 'n'
。std::string
呢?(你似乎在使用C++)。execve
这样的执行函数,您会发现它们实际上不接受const char*
作为参数,而是确实需要char*
,因此您不能使用字符串常量来调用main
。main
函数。 - Lightness Races in Orbit
main
函数的参数类型无关。(此外,你的代码存在内存泄漏问题。) - Rob Kennedymain
函数传递参数。在程序中调用main
函数是不合法的。调用main
函数是编译器为我们设置的,我们不能自己调用它。 - Rob Kennedynew
调用。该字符串从堆栈中获取自己的内存。 - Kyle