求解答…解决方案

求解答…
char *a="abc";
*a=‘A’;
为什么错了,为什么用指针不能修改,而数组却可以?这里表明了他们存储上什么样的区别呢?

------解决思路----------------------
"abc"表示一个常量字符串,你让一个指针指向这样的内存地址,不可以对其进行修改,因为是常量内容
------解决思路----------------------
char *a="abc";声明的是一个常量字符串,字符串中的内容是不可用修改的
char a[]="abc";声明的才是字符数组,是可以修改的
------解决思路----------------------
#pragma comment(linker,"/SECTION:.rdata,RW")
//加这句可以让常量区可写,后果自负!

------解决思路----------------------
比如说  char buffer[] = "abc";
这句话的意思是  用字符串abc给buffer初始化  编译器会自动分配4个字节给buffer所在的空间 (加上\0)
char buffer[5] = "abc"  同上 编译器不会自动分配空间  会赋值 a b c \0 (buffer[4]在有些编译器没赋值的自动补\0) 

对于目标文件 linux .o   windows .obj  (在链接成可执行文件之前格式)
而char *a="abc"; 只是用一个指针引用 这个字符串常量"abc"的地址    右边的字符串常量 “abc”一般保存在 .rodata中 有的编译器特殊情况下会保存在.data段中   而char buffer[] 这个是 保存在栈中的。

虚拟内存地址空间的概念 每一个程序都会装作到一个虚拟内存空间的这种概念(下面没完全按虚拟内存 从高到低的顺序写) 
------------
系统内核

栈   
.rodata //只读数据段
.data    //可读数据段                --------------cache----------------->  真实的物理内存  
.bss     //
.text     //代码段
.......
------------