c++ - 将字符串文字分配给指向 const char 的指针

标签 c++ c

我可以知道为什么这个分配是可能的吗?

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/

相关文章:

java - 打印桌面的屏幕截图并转换为像素矩阵 [0,1]

c++ - 这个继承自 std::vector 的类声明有问题吗?

C++ 性能 : checking a block of memory for having specific values in specific cells

二叉搜索树和AVL树的常见节点结构

c - c中两个矩阵相乘的函数

c - 函数应该接受两个参数,一个数组和数组的大小

c++ - 有什么方法可以获取 llvm 引用指针值的原始类型(即指针类型)

c++ - 我如何正确地重载新的?

c++ - Visual C++ 中的全局变量

c++ - 未使用值警告 : C vs C++ using gcc