64,644
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
int main()
{
string a = "a"; //这种应该是在栈中分配空间吧?
char x[] = "a"; //同上吗?
char *y = "a"; //这是在堆上吧?
//下面的结果是true,怎样解释呢?
if(a == x)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
//下面这种比较显示结果为false,是因为一个在栈中,一个在堆中吗?
if(x == y)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
//下面的结果是true,怎样解释呢?
if(a == y)
{
cout<<"true\n";
}
else
{
cout<<"false\n";
}
return 0;
}
char* p = "hello string";
然后用二进制查看工具搜索exe中的这个字符串地址。再用pe查看工具看下这个地址属于哪个节。
关于pe文件有哪些节你应该清楚把,不清楚的话自己查资料。
由于编译器优化,相同的字符串会存储在相同的地址。现在假设pa指向"a"储存的地址。
变量a,x,y本身都存储在函数栈上,它们地址各不相同。
执行 string a = "a";只是将pa指向的字符串拷贝到string内部的存储空间。
关于string的内部结构,可以参考我的这篇文章:
http://blog.csdn.net/passion_wu128/article/details/38353959
执行char x[] = "a";时直接将pa指向的字符串拷贝到x
执行char *y = "a";时没有拷贝,只是将pa的地址赋值给y,两者指向同一个地址。
a==x为什么为true呢?
因为a==x相等于调用string类的operator==操作,你在这一行下断点,调试的时候step into一下就知道了
这个operator==会先将char* 类型的参数构造成一个临时的string对象,然后再比较。所以它实际比较的是字符串。
x == y只是简单的比较x和y表示的地址是否相等,x是栈上的一个数组地址,y是指向“a”的指针,当然不相等。
至于a == y,原理同a==x一样。
是不是一目了然了???