C++11 文字字符串赋值悖论

C++11 文字字符串赋值悖论,c++11,C++11,为什么要将文字字符串分配给可变字符数组 char * p = "Hello World!\n"; 将文本字符串传递给函数参数时,会导致警告,如 void function foo(char* p) { //do stuff } int main() { foo("Hello World!\n"); } 不会导致警告 我来自ruby land,所有这些都是为我做的lol这对我来说是一个大胆的新世界感谢你帮助我理解如果我编译你的程序,我会收到两次警告,这是我所期望的。指针赋值和带字符串

为什么要将文字字符串分配给可变字符数组

char * p = "Hello World!\n";
将文本字符串传递给函数参数时,会导致警告,如

void function foo(char* p) {
  //do stuff
}

int main() {
  foo("Hello World!\n");
}
不会导致警告


我来自ruby land,所有这些都是为我做的lol这对我来说是一个大胆的新世界感谢你帮助我理解

如果我编译你的程序,我会收到两次警告,这是我所期望的。指针赋值和带字符串文字的直接函数调用给出:

 warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
实际上,此警告应视为错误,因为您无法更改指针指向的内容。如果尝试修改运行的foo()中的内容

结果变成了一个异常,这正是我们所期望的

问题不在于函数foo,而在于常量数组的init

如果您将代码更改为:

void foo(char* p) {
    p[0]='n';
}   

int main() {
    char * from = "Hello World!\n";
    char * to = new char[100]; // enough space to put the string here
    strcpy( to, from );
    foo( to );
    foo( from );
    cout << to << endl;
 }   
区别在于:

from
现在是堆栈上的一个数组,位于函数main的本地。您可以在函数foo()中修改自己的数组


我的提示:如果您看到将常量值传递给非常量指针的警告,请始终将其视为错误,而不仅仅是警告。这只是一个警告,大量旧代码将不再编译。但请记住:对常量值的写访问始终是未定义的行为,通常是崩溃

嗯,很好。可能他们删除了4.8.1中的警告?如果您使用
std::string
,您可以避免任何这些问题。即使没有打开其他标志,clang和gcc也会产生警告。啊,谢谢大家。我给一个可变对象分配了一个文本字符串,并将其传递给一个函数。那个程序不会将字符串文本传递给一个函数。它不会对问题发出警告,因为没有问题要警告
foo
实际上是一个可变字符数组。这个示例还应该演示什么?它曾经是合法的C,并且必须允许向后兼容。
void foo(char* p) {
    p[0]='n';
}   

int main() {
    char * from = "Hello World!\n";
    char * to = new char[100]; // enough space to put the string here
    strcpy( to, from );
    foo( to );
    foo( from );
    cout << to << endl;
 }   
int main() {
    char from[]= "Hello World!\n";   
    //char* from= "Hello World!\n";
    foo( from );
    cout << from << endl;
}