今天看到了上的一篇文章http://blog.csdn.net/UndeadWraith/archive/2011/04/08/6310399.aspx,感觉挺有意思,总结了一下,给同事们分享了下,也拿到这里来分享一下吧。
// f0303.cpp // C串比较的错误方式 //===================================== #include<iostream> using namespace std; //------------------------------------- int main() { cout<<("join"=="join" ? "" : "not ")<<"equal/n"; // 直接字面值比较 char* str1="good"; char* str2="good"; cout<<(str1==str2 ? "" : "not ")<<"equal/n"; // 字符指针比较 char buffer1[6]="Hello"; char buffer2[6]="Hello"; cout<<(buffer1==buffer2 ? "" : "not ")<<"equal/n"; // 字符数组比较 }//====================================
实际运行结果(VS2008/2005/2003 G++(版本忘记了))
equal
equal
not equal
根据大家的第一印象1和3应该都答对了,主要就是2的问题。上写文章的人使用了反汇编,来查看汇编代码比较内存来看的,后来我仔细想了想其实大可不必那么复杂。
其实,1和2开的内存都是在全局常量区,而3是在堆栈中开的内存,编译器(应该是在编译器这层把?哈哈~)会对常量存储区有个优化。比如
#define NULL "NULL"
你在程序里写了1万个NULL,难道计算机会在常量存储区开1万个NULL的内存吗?显然不是这样的,它会比较并且引用已有的相等数据,也就是说str1和str2存放的指针地址是相同。所以会相等,在堆栈中开的内存,他就是两块独立的内存,指针的地址也肯定不会相等了。
转自:http://www.cnblogs.com/xi52qian/archive/2011/04/18/2019687.html