#include <iostream>
using namespace std;
int main()
{
char *fp = "Alex";
cout<<fp <<" "<<(void*)fp<<endl;
*(fp+1) = 'p';
cout<<fp <<" "<<(void*)fp<<endl;
}
答案 0 :(得分:6)
您修改了字符串文字。这是未定义的行为。
增加编译器的警告级别,您希望行char *fp = "Alex";
出现警告/错误,因为它会创建一个指向不可变数据的非const指针。它只允许在C ++中与C兼容,而且它也是一种错误。
答案 1 :(得分:5)
我真的不喜欢这样回答“问题”,但这是一个明显的错误:
*(fp+1) = 'p';
当您为其分配字符串文字时, fp
指向只读内存。因此,您无法修改fp
指向的内容。如果要将字符串声明fp
修改为char[]
,以便将其分配到堆栈中。
答案 2 :(得分:4)
我将不得不假设你在谈论the following compiler warning:
prog.cpp: In function ‘int main()’:
prog.cpp:5: warning: deprecated conversion from string constant to ‘char*’
下次请在问题中告诉我们为什么你认为某些事情是“错误的”。
正如警告所述,将字符串常量转换为char*
,而在C中则相当正常,在C ++中已弃用。
改为this:
#include <iostream>
using namespace std;
int main() {
char const *fp = "Alex"; // <--- `const` here
cout<<fp <<" "<<(void*)fp<<endl;
*(fp+1) = 'p';
cout<<fp <<" "<<(void*)fp<<endl;
}
然后,您将发现您的语句*(fp+1) = 'p'
无法编译。那是因为const
;事实上,原始代码中缺少const
只是隐藏 您可能无法修改该字符串文字的基础数据。
您应该将字符复制到程序拥有的新缓冲区。 You can do this neatly using std::string
:
#include <iostream>
#include <string>
using namespace std;
int main() {
string fp = "Alex";
cout << fp << " ";
fp[1] = 'p';
cout << fp << " ";
}
一般情况下,尽可能使用std::string
。很少有理由避免使用C ++标准库的功能。