为何C++中string对象地址&a与内部字符数组地址不同?
关于C++ std::string地址与内部字符数组地址的疑问
我为理解指针编写了如下C++代码:
#include <cstdio> #include <iostream> using namespace std; int main() { string a = "hello"; const char *st = &a[0]; printf("%p\n", &st[0]); printf("%p\n", &(a[0])); printf("%c\n", *st); printf("%p", &a); }
运行后得到输出:
0x1265028 0x1265028 h 0x7ffe26a91c40
我原本认为&a返回的是string的地址,但为何它的值与另外两个地址不同?
解答
&a确实是std::string对象本身的地址,而&a[0](或&st[0])是string对象内部存储的字符数组的首地址,二者指向的是完全不同的内存区域。
std::string作为C++标准库的类,它的实例(比如这里的a)会在栈上分配自身的结构体空间——里面包含了指向字符数据的指针、字符串长度、容量等成员变量;而实际的字符内容(比如"hello")通常存储在堆内存中(如果字符串长度超过了小字符串优化的阈值)。
所以:
&a获取的是栈上string对象a的起始地址,对应你输出里的0x7ffe26a91c40&a[0]获取的是string对象内部指向的堆上字符数组的首地址,对应0x1265028,这也是指针st指向的位置,因此*st能输出字符'h'
简言之,string对象本身和它管理的字符数据是两块独立的内存,地址自然不一样。
内容的提问来源于stack exchange,提问作者babybrain
相关产品推荐
相关产品推荐

