字符串字面值不能更新
指向字符串字面值的指针变量不能用来修改字符串的内容:
但如果你用字符串字面值创建一个数组,就可以修改了:
char cards[] = "JQK";
这是由C语言使用存储器的方式决定的……
存储器中的char *cards="JQK";
为了弄明白这行代码导致存储器出错的原因,我们需要切开计算机的存储器,看看计算机究竟将会做哪些事。
- 计算机加载字符串字面值。
当计算机把程序载入存储器时,会把所有常数值(如字符串常量“JQK”)放到常量存储区,这部分存储器是只读的。
- 程序在栈上创建cards变量。
栈是存储器中计算机用来保存局部变量的部分,局部变量也就是位于函数内部的变量,cards
变量就在这个地方。
- cards变量设为“JQK”的地址。
cards
变量将会保存字符串字面值“JQK”的地址。为了防止修改,字符串字面值通常保存在只读存储器中。
- 计算机试图修改字符串。
程序试图修改cards
变量指向的字符串中的内容时就会失败,因为字符串是只读的。
所以问题出在像“JQK”这样的字符串字面值保存在只读存储器中。它们是常量。
既然知道了症结所在,如何对症下药呢?