指向字符串的指针无法更改字符

Posted

技术标签:

【中文标题】指向字符串的指针无法更改字符【英文标题】:Pointer to String Fails to Change Character 【发布时间】:2017-08-05 22:50:33 【问题描述】:

为什么我可以更改指针p 中的元素,但不能更改指针r 中的元素?我猜它必须与指针的属性有关。

p[2] 更改为w 会成为再见。更改 r 会使代码崩溃。

p的地址是0x69fee0

r的地址是0x69fedc

两者在 for 循环中具有相同的输出(除了单词“再见”结束后的垃圾数据)。

int main()

    char q[]="Goodbye";
    char* p = q;
    char* r = "Goodbye";

    cout<<"Address of p: "<<&p<<endl;
    cout<<"Address of r: "<<&r<<endl;
    for(int i = 0; i<10; i++)
    
        cout<<"P["<<i<<"]: "<<p[i]<<endl;
        cout<<"R["<<i<<"]: "<<r[i]<<endl;
    
    p[2]='w';
    cout<<p<<endl;
    r[2]='w';
    cout<<r<<endl;
    return 0;

【问题讨论】:

【参考方案1】:

不同之处在于q 是一个(可变)数组,它使用字符串文字"Goodbye" 的“副本”初始化,而r 是指向(不可变)字符串文字本身的指针。更改字符串文字是未定义的行为(因此可能会崩溃或执行其他操作)。

【讨论】:

【参考方案2】:

此错误的原因是 * 和 [ ] 之间的差异:-

实际的区别是当我们声明 *r = “Goodbye” 编译器会将 Goodbye 置于只读部分 内存并返回指向该位置的指针 将被放置在 char 指针和任何写操作中 将导致分段错误

但是 q[] 将为字符分配内存位置 然后将字符复制到该位置和位置 是可写的,所以任何修改都是有效的。

【讨论】:

无法保证字符串文字将被放置在“只读内存”中。 C++ 标准只是说尝试修改字符串文字会导致未定义的行为。

以上是关于指向字符串的指针无法更改字符的主要内容,如果未能解决你的问题,请参考以下文章

char *和const char *之间的区别?

文件系统 value_type 指向字符串的指针?

指向字符串常量的指针[重复]

如何在 C# 中编组指向一系列以 null 结尾的字符串的指针?

C++字符指针指向字符串

获取指向 LLVM-IR 中数组第一个元素的指针