野指针 悬空指针和悬空引用

空悬指针是这样一种指针:指针正常初始化,曾指向过一个正常的对象,但是对象销毁了,该指针未置空,就成了悬空指针。

野指针是这样一种指针:未初始化的指针,其指针内容为一个垃圾数。 (一般我们定义一个指针时会初始化为NULL或者直接指向所要指向的变量地址,但是如果我们没有指向NULL或者变量地址就对指针进行使用,则指针指向的内存地址是随机的)。存在野指针是一个严重的错误。

int main() {
    int *p; // 指针未初始化,此时 p 为野指针
    int *pi = nullptr;

    {
        int i = 6;
        pi = &i; // 此时 pi 指向一个正常的地址
        *pi = 8; // ok
    }   

    *pi = 6; // 由于 pi 指向的变量 i 已经销毁,此时 pi 即成了悬空指针

    return 0;
}

  

原文地址:https://www.cnblogs.com/wuyepeng/p/9732607.html

时间: 2024-10-16 01:43:53

野指针 悬空指针和悬空引用的相关文章

程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针会悬空,由于在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中.生命期和程序一样长,函数退出时变量 // 依旧有效 return fruit; }

程序猿之---C语言细节22(函数返回指针注意事项&lt;悬空指针&gt;、查看进程可以分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程可以分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针以及悬空,因为在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中,生命期和程序一样长,函数退出时变量 // 依然有效 return fruit; }

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除

详解c++指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

c++中指针的指针和指针的引用的使用

当指针作为函数的参数进行传递时,实际上本质上是安置传递,即将指针进行了一份拷贝,在函数的内部对这个指针的修改实际上就是对一个在函数内部的那个局部变量的修改.这点事和引用不同的,引用实际上是在参数传递时,将实际变量的地址传了进去,在函数内部访问这个变量时,实际上是使用间接访问的方式来进行了的,所以实际上就是访问了元变量.但是由于只是将地址进行了拷贝,所以对这个指针所指向地址的修改不会对原有的指针产生影响.若果要实现对指针的修改,需要使用指针的指针或者指针的应用进行传递. 一.指针的指针 int v

指针与指针的引用

C++之研究--指针和引用 VB中的函数或过程的參数有2种传递方式:一种是值传递:一种是引用传递.分别用keywordByVal和keywordByRef指出.假设參数是以引用传递的话,函数或过程内部就能够靠这个引用參数来改变外部变量的值.在C语言中,假设要实如今函数内部改变外部变量的值的话,就应该传递这个变量的指针.假设要通过指针訪问变量,必须使用指针运算符"*".这样在源码中就会显得比較别扭: void function(int *pval){*pval=100;//pval=10

C++ 指针—02 指针与引用的对比

★相同点: ●都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名. ★不同点: ●指针是一个实体,而引用仅是个别名: ●引用只能在定义时被初始化一次,之后不可变:指针可变:引用"从一而终",指针可以"见异思迁": ●引用没有const,指针有const,const的指针不可变: ●引用不能为空,指针可以为空: ●"sizeof 引用"得到的是所指向的变量(对象)的大小,而"sizeof 指针"

C/C++:提升_指针的指针和指针的引用

C/C++:提升_指针的指针和指针的引用 ◇写在前面 今天在使用指针的时候我发现了一个自己的错误. 我刚开自以为是觉得输出的两个P都是6,当时觉得两个p所指的地址相同,要修改就都修改了. 这是一个很低级的错误,两个p所指的地址相同,但是这两个指针的地址是不一样的. 好比两个人都知道火车站怎么走,但不能说这两个人是一个人,更何况在修改中一个人已经忘了火车站,它只知道高铁站怎么走,那另一个只知道火车站的并没有受到影响,他还是只知道火车站. 好了,那么如何做到main修改里面的p呢?要用到两种技术: