更改字符指针的值

时间:2018-02-13 08:58:15

标签: c++ pointers string-literals

为什么上述工作?

char*p = new char[4];
p = "hey";
p = "jey";

但这不是吗?

char* p = new char[4];
p = "hey";
p[0] = 'j';

第二个例子导致分段错误。

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

2 个答案:

答案 0 :(得分:6)

"hey""jey"等字符串文字是常量,您无法修改。

陈述

p = "hey";
p = "jey";

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

您在第二个示例中遇到了同样的问题,但是当您尝试使用

修改字符串文字时会出现段错误
p[0] = 'j';

想象一下,"hey"存储在地址0x010x020x03的一些只读内存中,用于三个字符,p指向0x01 1}}。执行p[0] = 'j'您正在尝试更改存储在地址0x01中的值,但由于它是只读内存,因此您将获得段错误。

答案 1 :(得分:2)

"哎"是const char*指针,字符串放在代码段上,因此它应该是只读的。

char* p = new char[4]; //pointer point on virtual memory 
p = "hey"; //pointer point on code (read only) memory , previous allocation lost.
p[0] = 'j'; //write on read only memory.

如果更改只读部分,则可能导致seg故障。

你可能有关于char *指向const char *的警告。你也有内存泄漏,因为你用new分配数组,然后通过赋值运算符覆盖它。

要解决此问题,最好使用std::string

std::string str;
str = "hey"; //the text is copied by operator =
str[0] = 'j';//byte is changed by operator [] 

如果你想使用指针,这也会起作用:

char* p = new char[4]; //allocate virtual memory (read/write).
strcpy(p ,"hey"); //don't point to read only code segment, copy it to the read/write virtual memory.
p[0] = 'j'; //change a single byte on pointed memory.

您只是在分配后不改变p的值,只更改虚拟内存上的字符串副本。

BTW:你应该在完成使用后删除分配。任何new必须具有相应的delete

delete [] p; //you must free the allocated array.