使用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
相关产品推荐
相关产品推荐

