看起来差不多的程序,但是第一个能正常运行,第二个却不能运行,为什么呢?
要正确理解这个问题,需要了解C语言中变量及常量的存储位置,这个其实在咱们程序员互动联盟里面以前的文章中应该也讲到过,一直阅读和关心的朋友应该看到过。
这里我再简单重复一下,C语言变量分为BSS段,数据段和栈区;而常量数据则会被编译器放到文本段,这个段实际上跟代码段在一起。你分析执行程序时常常会看到一个.text或者.code。这个段默认是只读的,也就是你不能去改写它。
上面两部分程序的关键在main函数中定义的
char *s1 = “china”, *s2 = “ch”;
和
char s1[] = “china”, s2[] = “ch”;
按第一种方式,s1和s2本身是一个栈中的变量,但它们指向的字符串都放在代码段中,是一个只读的内存块,所以这种情况下,要用第二个字符串去逐个替换时,操作系统会检查到目标内存是一个只读属性的存储单元,会给程序返回一个异常,于是我们就看到下面这个出错的对话框了。