关于指针及地址的困惑:指针输出异常问题咨询
问题解答:char*指针输出为空的原因
嘿,这个问题其实是C++里std::cout对char*类型的特殊处理逻辑搞的鬼,咱们一步步理清楚:
核心原因:cout对char*的特殊重载
C++标准库的std::cout有一个专门针对char*类型的输出重载——它会把char*当作C风格字符串来解析:从指针指向的内存地址开始,逐个输出字符,直到遇到\0(空字符)才停止。
1. 为什么buffer的地址没显示?
你用memset(buffer, 0, 8)把整个buffer的8个字节都填成了\0,这就意味着buffer指向的是一个开头就是\0的内存区域。当cout处理这个char*时,一看到第一个字符就是终止符,直接就输出空内容了,根本不会输出指针的地址。
2. 为什么*ptr2也没有内容?
ptr2是char**类型,解引用*ptr2得到的就是buffer本身(也就是那个char*指针)。同样触发了cout对char*的字符串处理逻辑,自然也输出空内容。
3. 为什么ptr和ptr2能正常输出地址?
对于int*(比如ptr)或者char**(比如ptr2)这类非char*的指针类型,cout没有专门的字符串处理重载,所以会直接输出指针对应的内存地址值,这就是它们能正常显示的原因。
解决方法:强制输出地址
如果你想看到char*类型指针的实际地址,可以把它强制转换成void*类型——cout对void*会输出指针地址,而不是当作字符串处理。修改后的代码片段如下:
std::cout << "buffer pointer is pointing to address " << static_cast<void*>(buffer) << std::endl; std::cout << "Dereferencing ptr2 = " << static_cast<void*>(*ptr2) << std::endl;
这样运行后就能看到buffer的真实地址啦。
内容的提问来源于stack exchange,提问作者Clan
相关产品推荐
相关产品推荐

