You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:45:46