更改字符指针的值

D G*_*Gul 4 c++ pointers string-literals

为什么以上工作?

char*p = new char[4];
p = "hey";
p = "jey";
Run Code Online (Sandbox Code Playgroud)

但这不是吗?

char* p = new char[4];
p = "hey";
p[0] = 'j';
Run Code Online (Sandbox Code Playgroud)

第二个示例导致分段错误.

在第一个例子中,"jey"是否覆盖"hey"

Dei*_*Dei 6

字符串文字,例如"hey"或是"jey"常量,您无法修改.

声明

p = "hey";
p = "jey";
Run Code Online (Sandbox Code Playgroud)

使p指向分配的字符串的第一个元素.虽然语言允许,但您丢失了指针信息new,现在您有内存泄漏.

您在第二个示例中遇到了同样的问题,但是当您尝试使用时修改字符串文字时会出现段错误

p[0] = 'j';
Run Code Online (Sandbox Code Playgroud)

Imagine "hey"存储在地址上的一些只读存储器中0x01,0x02以及0x03三个字符和p指向的地址0x01.这样做p[0] = 'j'你正在试图改变存储在地址中的值0x01,但因为它是只读存储器,你得到的段错误.