指针与数组存储分析
来源:互联网 发布:艾美仕数据 编辑:程序博客网 时间: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所指向的内存区域的内容是不允许被修改的。
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所指向的内存区域的内容是不允许被修改的。
- 指针与数组存储分析
- 数组与指针分析
- 数组与指针分析
- 指针数组 与 数组指针 的分析
- 指针数组(存储指针的数组)与数组指针(指向数组的指针)
- C 指向数组的指针,与存储指针的数组
- 指针与数组不同的存储区域
- C语言数组与指针定义分析
- 数组 与 指针 之间的关系 分析
- 指针与数组的基础知识分析
- 主题四 指针和数组(下)----25.指针数组与数组指针分析
- 存储指针的数组
- 指针:指针与数组
- 指针与指针数组
- 字符指针与字符数组的存储问题
- 数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
- 指针数组与数组指针
- 指针数组与数组指针
- 【listview&checkbox】listview中有checkbox 滑动后状态改变
- SPOJ 962 - Intergalactic Map 1<-2->3 构图最大流
- 解读:百度将处理不相关静态搜索结果页
- Visual Studio 2008 和 Windows 环境变量及如何在文件中引用环境变量
- 出栈次序问题---卡特兰属的另一种理解
- 指针与数组存储分析
- MetaModel感兴趣的由来
- 设置Eclipse/MyEclipse的workspace路径
- 设计模式之访问者模式
- 扑克牌的顺子
- HackerRank Algorithms-Search-Pairs 数组的固定差对数
- Spring3.x企业开发实战之Ioc容器概述
- 【ConcurrentModificationException】java.util.ConcurrentModificationException 解决办法
- 编程用两个栈实现一个队列