c ++ beginner ---使用指针进行字符串修改

时间:2014-02-19 06:49:06

标签: c++ arrays string pointers

我刚刚开始学习指针和数组之间的关系。我从这个线程(What is the difference between char a[] = ?string?; and char *p = ?string?;?)读取的是指针指向的字符串无法更改。但是在下面的代码中,我可以将pa指向的字符串从abc更改为abd而没有任何问题。

int main()
{
    char *pa;
    pa="abc";
    cout<<pa<<endl<<endl;
    pa="abd";
    cout<<pa<<endl<<endl;
    return 0;

}

但是,它在这段代码中不起作用。有人可以向我解释一下这个区别吗?非常感谢!!

int main()
{
    char *pc;
    pc="abc";
    cout<<pc<<endl<<endl;
    *(pc+2)='d';
    cout<<pc<<endl<<endl;
    return 0;
}

3 个答案:

答案 0 :(得分:3)

在第一种情况下,你没有改变字符串,实际上,发生了什么是首先你指向“abc”(pa="abc";)然后你正在指向指向“abd”({{ 1}}),前一个字符串即“abc”在内存中保持不变。

在第二种情况下,您的pa="abd";指针指向同一个字符串,语句pc尝试修改pc指向的值,这是无法完成的。

答案 1 :(得分:1)

通常,当程序运行时,字符串文字存储在只读内存中。 这是为了防止您意外更改字符串常量。这就是第二个例子中发生的情况,即你会得到一个分段错误错误。

这在您的第一个示例中没有发生,因为您没有更改字符串本身。相反,您刚刚将char *pa从指向一个字符串更改为另一个字符串。

您可能需要查看:Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?


P.S。如果您确实需要更改部分内容,我建议您使用string

string pc = "abc";
pc[2] = 'd'; 

此处,只读"abc"复制到非const pc中,以便您更改其内容。

答案 2 :(得分:1)

@ user3858我不知道你是否知道静态,自动和动态内存分配,但让我告诉你'pa'是你的自动(指针)变量,最初指向静态内存区域“abc”然后你把它转移到指向其他一些内存区域,里面装满了“abd”。“abc”和“abd”,两者都是不同的区域。而在你的第二个程序中,你实际上是在“abc”区域进行了更改使它成为“abd”并且您遇到错误。