C++指针探索(一)

C++指针探索(一)

内存
C++内存模型为:代码区、静态区、栈区、堆区、常量区。指针就是内存地址,因此只要在内存中的,指针都可以指向,也就是说指针可以指向代码区、静态区、栈区、堆区、常量区。C++指针可以指向C++中的任何变量。指针即寻址方式为间接寻址,可以有二级指针、三级指针。。。。,级数受内存大小限制。
指针中存放的是内存地址,所以指针本身是没有数据类型的,而C++中可以有整形指针、字符串指针等不同类型的指针。目的在于指定读取存放的内存地址中的数据时内存长度,假设整形(4字节)指针,读取内存数据时,从指向的起始地址开始,读取整形的内存长度为四字节。
C++中指针类型可以强制转换, 指针在C++中占的内存大小是固定的与其类型无关。
空指针
标准并没有对空指针指向内存中的什么地方这一问题作出规定,也就是说用哪个具体地址值表示空指针取决于系统实现。我们常见的空指针一般指向0地址,即空指针的内部用全0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体参见 C FAQ。注意:不要把空指针的内部实现表示等同于整数0的对象表示——如上所述,有时它们是不同的。
实际上空指针的0地址并不是物理内存的开端的0地址,这与操作系统的内存机制有关,windows系统会给程序分配一段专属的内存区域,该程序的相关资源均运行在该内存区,所以程序空指针指向的实际上是该段内存的起始地址,也就是说不同进程的空指针指向的物理内存地址其实是不同的,虽然他们逻辑上都指向0地址。
空指针赋值分区是进程的地址空间中从0x00000000 到 0x0000FFFF 的闭区间(64K 的内存大小),这 64K 的内存是一块保留内存,不能被程序动态内存分配器分配,不能访问,也不能使用,保留该分区的目的是为了帮助程序员捕获对空指针的赋值。如果进程中的线程试图读取或者写入位于这一分区内的内存地址,就会引发访问违规。
归根结底,程序中所使用的数据都需要从物理设备上获取,即程序中的数据需要从一个真实的物理地址中读取或者写入。所以当一个指针的逻辑地址可以通过计算能够准确无误的映射到一个正确的物理地址上时,这时候数据的访问就是正确的,程序的执行也没有任何问题。如果一个指针为空指针,那么该指针所指向的逻辑地址空间位于空指针赋值分区的区间上。空指针赋值分区上的逻辑地址没有物理存储器与之对应,因而访问时就会产生违规访问的异常。
野指针
野指针是指向不合法内存的指针。
野指针的出现有三种情况:初始化时未赋初值、指针被free或delete后没有及时指针本身、指针指向临时变量,访问越界。初始化时指针的缺省值是随机的,所以未赋初值会导致指针指向不可预测的内存,导致程序产生意想不到的错误;指针所指向的内存地址数据被释放掉后,指针依然指向该内存;指向临时变量的问题原理上同上;指针操作数组时由于C++的数组没有越界检查,因此很容易访问越界访问到了不该访问的内存区域

发布了5 篇原创文章 · 获赞 0 · 访问量 216

猜你喜欢

转载自blog.csdn.net/m0_46412866/article/details/104588248