char p[] = “abc”;把常量区的字符串值取出来放到寄存器,再由把寄存器中的值拷贝到栈内空间
p数组作为局部变量被存储在栈区;
"abc"不是常量,编译器把这个语句解析为 char str[4] = {‘a’,‘b’,‘c’,’\0’}; 如果char p[] = “abc”;写在函数内部,那么这里的"abc\0"因为不是常量,所以应该被放在栈上。
在这个声明中,"abc"被存储在静态数据区(全局).rodata, "abc"是常量
p是个指针,指向这个区域,p是被放在栈上的,并没有定义空间.
ptr[0] = ‘x’;能编译通过,但执行ptr[0] = ‘x’;就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。
在vs2019中编译不通过,要加const
char *是历史遗留问题,如果程序修改了字符变量变量会有可能导致程序的崩溃
char *p1 = "hello world!"; char *p2 = "hello world!"; char p3[] = "hello world!"; char p4[] = "hello world!"; printf("p1:%x\np2:%x",p1,p2); p1p2指向同一块地址 p1=p2 printf("p3:%x\np4:%x",p3,p4); p3!=p4