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

C风格强转char地址为void*再转回char*地址出现差异是什么原因

问题原因

这个差异和指针转换的正确性无关,完全是两次测试代码的输出项不一致导致的乌龙:

  • char版本的第三行输出的是 &charPtr:这是charPtr这个指针变量自身在栈上的内存地址,不是它存储的、指向example的地址。你前两行输出的都是example的地址,二者当然不一致。
  • short版本的第三行输出的是 shortPtr:这是shortPtr这个指针变量存储的、指向example的地址,和前两行的输出内容一致,所以结果相同。

补充说明

你在char版本里额外加取地址符&是因为cout对char*类型有特殊重载:如果直接输出char*,cout会把它当做C风格字符串处理,输出内存中从该地址开始到\0为止的字符内容,而非地址值。你为了输出地址给char*强转void*时,误加了&取到了指针变量自身的地址,才导致了看起来“转换出错”的假象。

修正后的char测试代码可以得到一致的结果:

char example = '-';
void* voidPtr = (void*)&example;
char* charPtr = (char*)voidPtr;

cout << (void*)&example << endl; // example的地址
cout << voidPtr << endl;         // 和上面一致
cout << (void*)charPtr << endl;  // 去掉&,输出charPtr存储的指向地址,和上面两个一致

C++标准明确保证:将任意对象指针转换为void*再转换回原类型指针,得到的指针和原始指针完全相等,不存在转换后地址变化的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:57:03