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

为何用指针指向SmartPtr对象时无法读取类首个成员dataPtr?

问题本质:指针类型的内存解读逻辑差异

你的判断核心是对的,问题出在不同指针类型对内存的解读方式完全不同,具体拆解两种情况:

1. 单指针char* s = (char*)&p;导致乱码的原因

当你把SmartPtr对象的地址&p强转为char*后,cout会将这个char*视为字符串的起始地址,直接从该地址开始逐字节读取,直到遇到'\0'才停止。

但SmartPtr对象的内存空间里存储的是成员变量dataPtr的值——也就是buff.Data的内存地址(一个4/8字节的数值,取决于系统位数)。这些字节对应的ASCII码大多是不可打印字符,且没有'\0'终止符,所以输出的就是乱码。

2. 双指针char** s = (char**)&p;得到正确结果的原因

char**是指向char*的指针,而SmartPtr的第一个成员正好是char*类型的dataPtr。此时&p(对象地址)就是dataPtr这个成员变量的存储地址,强转为char**后,*s就是读取这个存储地址里的内容——也就是dataPtr存储的buff.Data的地址。

cout输出这个地址对应的内容时,就会读取buff.Data里的字符串,自然得到预期的"Hello world"。

补充说明

你最初的认知“类首个成员的地址与对象地址相同”是正确的,但要区分两个概念:

  • 对象地址 = 首个成员变量的存储地址(即这个变量本身在内存中的位置)
  • 成员变量的值 = 它指向的目标内存地址

你需要用对应类型的指针去读取成员变量的值,而不是直接把对象地址当成成员变量的值来使用。


内容的提问来源于stack exchange,提问作者MrBit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:27