请告诉我这段代码有什么不对

时间:2011-06-13 00:13:19

标签: c++

#include <iostream>
using namespace std;

int main()
{
    char *fp = "Alex";

    cout<<fp <<" "<<(void*)fp<<endl;

    *(fp+1) = 'p';

    cout<<fp <<" "<<(void*)fp<<endl;

}

3 个答案:

答案 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 ++标准库的功能。