为什么上述工作?
char*p = new char[4];
p = "hey";
p = "jey";
但这不是吗?
char* p = new char[4];
p = "hey";
p[0] = 'j';
第二个例子导致分段错误。
在第一个例子中,“jey”是否覆盖"hey"
?
答案 0 :(得分:6)
"hey"
或"jey"
等字符串文字是常量,您无法修改。
陈述
p = "hey";
p = "jey";
使p
指向指定字符串的第一个元素。虽然语言允许,但您丢失了从new
获得的指针信息,现在您有内存泄漏。
您在第二个示例中遇到了同样的问题,但是当您尝试使用
修改字符串文字时会出现段错误p[0] = 'j';
想象一下,"hey"
存储在地址0x01
,0x02
和0x03
的一些只读内存中,用于三个字符,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.