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

为何strstr()返回的char指针相减为数值且cout输出p不是内存地址?

嘿,这两个问题其实都是C++里指针和标准库重载的常见小坑,我来给你掰扯清楚:

问题1:指向两个字符串的指针相减得到整数5的原因?

首先得明确C++里指针相减的核心规则:只有当两个指针指向同一个数组对象(或者数组末尾之后的一个合法位置)时,相减的结果才是它们之间的元素个数(类型是ptrdiff_t)。如果是指向完全无关的内存区域的指针相减,这属于未定义行为——编译器可以返回任何结果,甚至直接崩溃。

你这里得到结果5,大概率是因为编译器把字符串"ExtraCharacter"和"Character"放在了内存中相邻的位置,而且"Character"的地址比"ExtraCharacter"高5个字节(因为char的大小是1字节,所以差值就是字节数)。比如假设:

  • "ExtraCharacter"的起始地址是0x1000
  • "Character"的起始地址是0x1005
    那两个char*指针相减的结果就是0x1005 - 0x1000 = 5,刚好是你看到的数值。但一定要记住,这个结果完全依赖编译器的内存布局,换个编译器、换个编译选项,结果可能完全不同,绝对不能在生产代码里依赖这种行为!

问题2:为什么cout << p输出字符串而不是内存地址?

这是因为C++的标准库对std::ostream的operator<<做了特殊重载:当操作数是char*或者const char*类型时,它会把这个指针当成C风格字符串的起始地址,自动输出从该地址开始的所有字符,直到遇到'\0'结束符为止。

如果你想输出这个指针的实际内存地址,需要把它转换成void*类型,因为ostream对void*的重载是输出地址的十六进制形式:

cout << static_cast<void*>(p) << endl;

举个直观的对比例子:

const char* str = "Hello";
cout << str;          // 输出 "Hello"
cout << static_cast<void*>(str);  // 输出类似 0x7ffdabc12345 的十六进制地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:14:06