char *p1="china" 与char p2[]="china"的区别

来源:互联网 发布:计量经济学软件 编辑:程序博客网 时间:2024/05/22 13:05
<span style="font-size:18px;">#include<iostream>using namespace std;void fun(){char *p1 = "china";char p2[] = "china";*(p1 + 1) = 'A';*(p2 + 1) = 'A';}int main(){fun();return 0;}</span>

VS2015下编译可以通过

运行时出现问题


把*(p1+1)这一行注释掉则正常输出h    A

问题肯定出现在这一行,查看反汇编


p1中存储的是地址1358b30h  查看该地址处


p1存储的是字符串china的首地址 ,显然china存储在常量区中,只可读不可写

再看p2 先通过eax寄存器将china的前四个字节存在fun()函数的堆栈中,再通过cx寄存器将剩下的一个字节和0存入堆栈

小结:

1.char *p1="china";是将字符串china存储在内存中的常量区,再将首地址赋给p1,因此只可读不可写

 2.char p2[]="china";是将常量区中的字符串复制到函数的堆栈中,并将首地址赋给p2,因此通过p2可以读写

1 0
原创粉丝点击