我可以知道为什么这个分配是可能的吗?
char const *c = "Hello";
c = "there!";
它不是指向一个不能修改内容的位置吗?据我所知,它正在创建另一个对象并使 c 指向该对象。是真的吗。
在此方面的任何其他亮点将不胜感激。
最佳答案
像很多答案已经说的那样,const char *c
的读法如下:
c 是一个指向 const char 的指针
如果您不熟悉指针,指针会保存内存中某个“对象”的地址。
你的两个字符串,“你好”和“那里!”是字符串文字。在编译时(减去编译器优化),它们被放置在代码的 text/rodata 段中。不确定您是否熟悉内存中可执行文件的布局(也称为运行时环境),但您有 Text、Data、BSS、Heap 和 Stack。
在运行时,char 指针在堆栈上分配,首先设置为指向字符串“Hello”所在的内存区域,然后在您的第二个语句中,指针设置为指向“there! "
这两个字符串实际上都是内存中连续的字节 block ,您的指针只是指向一个字符串的开头,然后指向另一个字符串。
因此,即使看起来好像您是在堆栈上创建这些字符串,但实际上并非如此。
另一方面,如果您按如下方式声明字符串,
char ch[] = "Hello";
那么您不能重新分配 ch
以指向“那里”,因为在这种情况下 ch 是一个不可修改的左值
。
这有点超出您的问题范围,但希望它能帮助您更多地了解代码在幕后的样子。
关于c++ - 将字符串文字分配给指向 const char 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17160497/