C++野指针的具体实现

 更新时间:2024年03月19日 09:23:42   作者:Love coldplay  
野指针就是指针指向的不是一个有效(合法)的地址,本文主要介绍了C++野指针的具体实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

野指针就是指针指向的不是一个有效(合法)的地址。
在程序中,如果访问野指针,可能会造成程序的崩溃。

出现野指针的情况主要有三种:

1)指针在定义的时候,如果没有进行初始化,它的值是不确定的(乱指一气)。
2)如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是,指向的地址已失效。
3)指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收),让指针指向了函数的局部变量,或者把函数的局部变量的地址作为返回值赋给了指针。

规避方法:

1)指针在定义的时候,如果没地方指,就初始化为nullptr。
2)动态分配的内存被释放后,将其置为nullptr。
3)函数不要返回局部变量的地址。
注意:野指针的危害比空指针要大很多,在程序中,如果访问野指针,可能会造成程序的崩溃。是可能,不是一定,程序的表现是不稳定,增加了调试程序的难度。

实例1

#include<iostream>
using namespace std;
#include<string>

int main()
{
	int *p = (int *)(0x0000000955523);
	cout << "*p=" << *p << endl;
}

实例2

#include<iostream>
using namespace std;
#include<string>

int *func()
{
	int a = 3;
	cout << "a=" << a << "    a的地址为" << &a << endl;
	return &a;
}


int main()
{

	//  1.直接操作非法地址
	//int *p = (int *)(0x0000000955523);
	//cout << "*p=" << *p << endl;

	//  2.如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是,指向的地址已失效。


	//int *p = new int(3);
	//cout << "p=" << p << "*p=" << *p << endl;

	//delete p;
	//cout << "p=" << p << "*p=" << *p << endl;



	//3.指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收),
	//	让指针指向了函数的局部变量,或者把函数的局部变量的地址作为返回值赋给了指针。

	int *pp = func();//函数的局部变量的地址作为返回值赋给了指针
	cout << "pp=  " << pp << "     *pp= " << *pp << endl;
}

到此这篇关于C++野指针的具体实现的文章就介绍到这了,更多相关C++野指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 手拉手教你如何理解c/c++中的指针

    手拉手教你如何理解c/c++中的指针

    当你对C越来越熟悉时,你会发现把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一,这篇文章主要给大家介绍了关于c/c++中指针的相关资料,需要的朋友可以参考下
    2021-10-10
  • C语言大小端模式、判断大小端、大小端转换方法详解

    C语言大小端模式、判断大小端、大小端转换方法详解

    这篇文章主要介绍了C语言大小端模式、判断大小端、大小端转换的相关资料,大端和小端是数据在内存中的存储方式,大端模式下高字节存于低地址,小端模式则相反,大小端问题由数据类型多字节存储引起,不同选择形成不同存储模式,需要的朋友可以参考下
    2024-10-10
  • C++哈希应用之位图,哈希切分与布隆过滤器详解

    C++哈希应用之位图,哈希切分与布隆过滤器详解

    这篇文章主要为大家详细介绍了C++哈希应用中的位图、哈希切分与布隆过滤器,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-04-04
  • C语言基于循环链表解决约瑟夫环问题的方法示例

    C语言基于循环链表解决约瑟夫环问题的方法示例

    这篇文章主要介绍了C语言基于循环链表解决约瑟夫环问题的方法,简单描述了约瑟夫环问题并结合实例形式分析了C语言使用循环链表解决约瑟夫环问题的具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也可以参考一下
    2021-12-12
  • C++ 名称空间详情

    C++ 名称空间详情

    当一个项目变得大型之后,我们会引入很多的库,这么一来两个库很可能会定义List、Tree、Node同名的类,编译器要是不考虑这情况的话,程序员调用时就会出现冲突问题。C++提供了名称空间工具,以更好的控制名称的作用域,本文就来谈谈C++ 名称空间,需要的朋友可以参考一下
    2021-09-09
  • C++实现字符串类型相互转换的代码示例

    C++实现字符串类型相互转换的代码示例

    在C/C++编程中,字符串是非常基础且常用的数据类型,但是由于不同的编程语言或标准库可能采用不同的字符串类型,因此在不同的应用场景下可能需要进行字符串类型的相互转换,本文将介绍如何在C/C++中将char*,std::string,QString,CString/MFC String相互转换
    2023-06-06
  • C语言实现选择排序、冒泡排序和快速排序的代码示例

    C语言实现选择排序、冒泡排序和快速排序的代码示例

    这篇文章主要介绍了C++中实现选择排序、冒泡排序和快速排序的代码示例,例子带有执行时间统计还可以简单看一下效率对比,需要的朋友可以参考下
    2016-04-04
  • VS中的scanf_s函数和scanf用法及说明

    VS中的scanf_s函数和scanf用法及说明

    这篇文章主要介绍了VS中的scanf_s函数和scanf用法及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java C++题解 leetcode第k个数实例

    Java C++题解 leetcode第k个数实例

    这篇文章主要为大家介绍了Java C++题解 leetcode第k个数实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论