发布网友
共1个回答
热心网友
C/C++代码中像"a"这样的字符串都会存储在可执行文件常量区,说得更具体一点是pe文件的rdata节,这是只读的。
你可以验证一下:
在你代码中写出*y = 'b'。运行时马上崩溃。
或者你写出
C/C++ code?
1
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一样。