长春迪瑞医疗电话:常量字符串容易出现的一个错误

来源:百度文库 编辑:中财网 时间:2024/04/27 15:41:03

char *a = "hello world";
char b[] = "hello world";
*a = 'c';
b[0] = 'c';
编译一下,编译通过,运行一下,崩溃了,这是为什么呢?
下面我们就来详细的分析一下:
当我们双击执行上述编译连接之后的.exe的时候,从逻辑上,操作系统是这样子做的,
char *a = "hello world";首先,操作系统在编译器规划内存方案中的的文字常量区分配一段内存(是连续的吗?),存储"hello world"字符串(以二进制的形式),然后在栈区分配一个内存,存储"hello world"字符串所在内存的首地址。
char b[] = "hello world";操作系统在编译器规划的内存方案中的栈区分配一段连续内存空间(12个字节),存储"hello world"字符串(以二进制的形式)。
那么当我们*a = 'c';的时候,就是试图修改文字常量区的内容,但是文字常量区存储的可都是常量,常量一经初始化,就不允许被修改,所以产生错误,于是杯具就发生了……
而b[0] = 'c';是修改的栈区数组的内容,当然是合法的啦。

怎么让编译器帮我们检查出错误呢?这就需要我们巧妙的使用const来显示的告诉编译器,哥定义的内容是不允许被修改的!
const char *a = "hello world";或者
char const *a = "hello world";
这样a就变成了一个常量指针,意思是说a是一个“指向常量的指针”,那么a所指向的内存区域的内容是不允许被修改的。
既然说到常量指针,我们不得不区分一下指针常量和常量指针这两个概念。
常量指针:指向常量的指针,是说该指针所指向的内存区域的内容是常量,不可以被修改,例如:
char array1 [] = "hello world";
const char a = array1;
*a = 'c';
这样子是不可以的,但是我们可以修改该指针所指向的内存区域,例如:
char array1 [] = "hello world";
const char a = array1;
char array2 [] = "hello china";
a = array2;
这样子是可以的,因为该指针不是一个指针常量。

指针常量:该指针是一个常量,就是说该指针所指向的内存是不可以被改变的,但是该指针所指向的内存所存储的内容是可以被改变的,例如:
char array1 [] = "hello world";
const char a = array1;
char array2 [] = "hello china";
a = array2;
这样子是不可以的,因为它试图为指针a重新赋值。
char array1 [] = "hello world";
const char a = array1;
*a = 'c';
这样子是可以的,因为该指针不是一个常量指针(指向常量的指针)