先看看这一段程序
char *city[] = {"aeijing", "shanghai"};
city [0][0] = 'b';
这段程序会是什么结果呢?
C语言中,对字符串常量用指针进行修改的行为是未定义行为,那么,到底,具体,会发生什么呢?
其实,这是跟操作系统有关的,为什么这么说呢?
因为 C 编译器负责生成程序后,程序的执行其实还是得靠操作系统,而程序中不规范的行为也是由操作系统进行约束。
好吧。。那为什么说这种行为不规范呢?
因为逻辑上,字符串常量不应该被修改,就这么简单。 好吧。。那操作系统会有什么反应呢? 在 win8 上,程序直接退出,没有别的信息,在某些 IED 的 debug 模式下,可能会提示写入位置冲突,在某些系统下可能正常。。没有异常发生
不过。。到底是为啥呢,为啥这样修改就不行?
因为字符串常量是保存在程序的常量存储区中,现代操作系统都禁止对运行中程序的修改,换句话说,程序在运行中,本身是不能被修改的,而常量存储区(静态存储区)就属于这部分。在多进程操作系统中,一个程序可能对应多个进程,因此对程序本身数据(当然已经加载到内存了)的修改会毫无预兆的使其他进程受影响,这是不合理的,所以对单进程操作系统,这种做法似乎是可以接受的。