为何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
相关产品推荐
相关产品推荐

