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

使用cout打印char指针地址触发AddressSanitizer栈缓冲区溢出

问题原因与解决办法

你遇到的问题是**std::cout对char*类型的特殊处理导致的栈缓冲区溢出**:

  • 当你用cout输出char*时,它会把这个指针当成C风格字符串处理——从指针指向的位置开始,持续读取字节直到遇到'\0'(字符串终止符)才停止。
  • 但你的代码里,ptr只指向单个char变量'a',这个变量后面没有紧跟'\0',所以cout会顺着栈内存持续读取,越界访问了不属于当前变量的内存,触发了AddressSanitizer的栈缓冲区溢出检测。

而用int*时没有问题,是因为cout对非char*的指针类型,会直接输出指针的内存地址,不会尝试当成字符串解析。

解决办法

要打印char*的地址,你需要把它强制转换为void*,让cout按照指针地址的方式输出,而不是当成字符串:

修改后的代码:

#include <iostream>
using namespace std;

int main(void) {
  char ch = 'a';
  char *ptr = &ch;
  cout << static_cast<void*>(ptr) << endl;
  return 0;
}

或者也可以用C语言的printf来输出,它的%p格式符专门用来打印指针地址,不需要额外转换:

#include <iostream>
#include <cstdio>
using namespace std;

int main(void) {
  char ch = 'a';
  char *ptr = &ch;
  printf("%p\n", ptr);
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:34:52