定义一个字符串的时候可以有很多种方法,比如下面两种
char *p1 = "wiz"; char p2[] = "wiz";
第一种和第二种都可以正确的定义一个字符串,而且在不试图改变字符串内容使用的时候没有什么区别。但是一旦想改变其内容,问题就来了。
p1[0] = 'f'; //not ok p2[0] = 'f'//ok
p2实际上是一个字符数组,改变第一个元素的内容是允许的。而p1则不行。
因为p1实际上是一个字符串指针,他仅仅代表了一个地址。在大多数的编译器中,往往会把字符串常量放入静态存储区。而且只存一份。而此时p1就指向了静态存储区的一个地址。当试图去改变p1[0]的内容的时候,会引发内存错误。如果有些编译器,允许这种操作,这样也会导致,其他引用“wiz”这个字符串的地方,实际上引用的是“fiz”。