指针与数组存储分析

来源:互联网 发布:艾美仕数据 编辑:程序博客网 时间:2024/05/16 07:01
char *a = "hello world";
char b[] = "hello world";
*a = 'c';
b[0] = 'c';
编译一下,编译通过,运行一下,崩溃了,这是为什么呢?
下面我们就来详细的分析一下:
从逻辑上,操作系统是这样子做的,
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所指向的内存区域的内容是不允许被修改的。