我刚刚开始学习指针和数组之间的关系。我从这个线程(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;
}
答案 0 :(得分:3)
在第一种情况下,你没有改变字符串,实际上,发生了什么是首先你指向“abc”(pa="abc";
)然后你正在指向指向“abd”({{ 1}}),前一个字符串即“abc”在内存中保持不变。
在第二种情况下,您的pa="abd";
指针指向同一个字符串,语句pc
尝试修改pc指向的值,这是无法完成的。
答案 1 :(得分:1)
通常,当程序运行时,字符串文字存储在只读内存中。 这是为了防止您意外更改字符串常量。这就是第二个例子中发生的情况,即你会得到一个分段错误错误。
这在您的第一个示例中没有发生,因为您没有更改字符串本身。相反,您刚刚将char *pa
从指向一个字符串更改为另一个字符串。
P.S。如果您确实需要更改部分内容,我建议您使用string
。
string pc = "abc";
pc[2] = 'd';
此处,只读"abc"
被复制到非const pc
中,以便您更改其内容。
答案 2 :(得分:1)
@ user3858我不知道你是否知道静态,自动和动态内存分配,但让我告诉你'pa'是你的自动(指针)变量,最初指向静态内存区域“abc”然后你把它转移到指向其他一些内存区域,里面装满了“abd”。“abc”和“abd”,两者都是不同的区域。而在你的第二个程序中,你实际上是在“abc”区域进行了更改使它成为“abd”并且您遇到错误。