c语言野指针导致问题,C语言进阶之路(三)----野指针的产生原因及解决办法

1.会产生野指针的做法

#include

//这就是一种错误的写法

int main(){

int *p = NULL;

p = (int *)malloc();

//释放P所指向的内存空间,但指针变量p仍然留在栈中,成为了野指针

if (p != NULL){

free(p);

}

if (p != NULL){

free(p);

}

return ;

}

2.正确的做法:

#include //指针变量和指针所指向的内存变量是两个不同的概念

//使用动态内存分为三步

//1.定义时,将指针为定义NULL

//2.释放内存时,把指针变量重新赋值或者NULL

//3.释放内存后,把指针变量赋值为NULL

int main02()

{

int *p = NULL;

p = (int *)malloc();

//这才是正确的写法

if (p != NULL){

free(p);//释放P所指向的内存空间,但指针变量p仍然留在栈中,成为了野指针

p = NULL;//释放野指针

}

return ;

}

3.间接赋值是指针存在的最大意义

间接赋值的条件:

(1)定义实参(普通变量)和形参(指针变量)

(2)把实参的地址传给形参

(3)利用形参来修改实参的值

被调用函数分配的内存,结果传出来的两种方法

(1)return

(2)指针做函数参数

//这种方式是通过return将函数分配的内存传给被调用函数

char *getBuf()

{

char *p = NULL;

p = (char *)malloc();

strcpy(p, "zhanghanzhi");

return p;

}

//这种方式是通过指针作为函数参数间接赋值

void getBuf(char *p)

{

char tmp = NULL;

tmp = (char *)malloc();

strcpy(tmp, "zhanghanzhi");

p = tmp;

}

int main()

{

//1.定义实参(普通变量)和形参(指针变量)

char *p;

//2.把实参的地址传给形参

//3.利用形参来修改实参的值

getBuf(p);

return ;

}

4.几个本质

数据类型:数据类型的本质是固定大小内存的别名。对变量声明数据类型,是为了告诉编译器分配几个字节的内存。

变量:变量的本质是一段内存空间的别名。也就是给一段内存空间取一个新的名字,就是变量。

指针:指针也是一种数据类型,它的值是某一个内存空间的地址。指针的步长根据它指向的内存空间的数据类型而定。

*p在等号左边是对p所指向的内存空间赋值;*p放在等号的右边是对p所指向的内存空间取值。

数组中[]的本质:假如有数组array,则array[i]等价于*(array+i),是因为[]对于程序员来讲是友好的,但是编译器最终还是要将它理解为指针,也就是数组作为函数参数时的退化。array[i] ==> array[0+i] ==>*(array+i)

三.野指针和free

在C语言项目中,经常会遇到需要程序员手动分配内存的地方.这样做能够节省大量的内存空间,也让程序更加灵活.只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合.这个组合使用 ...

C语言之free函数及野指针

[FROM MSDN && 百科] 原型:  void free(void *ptr); #include或#include

linux kernel elv_queue_empty野指针访问内核故障定位与解决

1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594 ...

c++内存泄漏原因及解决办法(智能指针)

内存泄漏 由于疏忽或错误造成程序未能释放已经不再使用的内存的情况.内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费. 内存泄露的 ...

go语言学习之路三:切片

前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片. 一.切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1.值类型:是一种由类型的实 ...

C语言进阶之路(二)----字符串操作常见模型

1.while模型 #define _CRT_SECURE_NO_WARNINGS #include #include #includ ...

C语言基础篇(三) 指针

导航: 1.指针     2. 数组     3. 结构体,共用体     4. 内存分布图     5. 段错误分析 ----->xx

C语言进阶学习第三章

以下记录动态内存分配: 1.malloc和free malloc和free分别用于执行动态内存分配和释放.这些函数维护一个可用内存池,当一个程序需要一些内存时,调用malloc函数,malloc从内存 ...

C语言进阶之路(一)----C语言的内存四区模型

内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...

随机推荐

1Z0-053 争议题目解析25

1Z0-053 争议题目解析25 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 25.You enabled Flashback Data Archive on the INVEN ...

python中from module import * 的一个陷阱

from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...

java多线程之ThreadLocal

ThreadLocal为每个线程保存变量,以保证数据同步. package Thread.Common; import java.util.Random; import java.util.concu ...

定制属于自己的自动化安装的linux系统镜像

使用软件和平台 1.基于平台:                  Vmware workstation 8.0 2.基于系统镜像:               rhel-server-5.8-i386 ...

XSS【跨站脚本攻击】

从客户端(txt="

Vue源码之目录结构

Vue版本:2.6.9 源码结构图 ├─ .circleci // 包含CircleCI持续集成/持续部署工具的配置文件 ├─ .github // 项目相关的说明文档,上面的说明文档就在此文件夹 ├ ...

MySQL安装的挫折之路

由于对MySQL卸载的不干净,mysql 的MySQL Connector Net/xxx无法卸载,后期重装无法成功.所以只能采用zip 安装https://www.cnblogs.com/Micha ...

(转)Java中equals和==、hashcode的区别

背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Test public void test01() { String a = "a" ...

leecode第四题(寻找两个有序数组的中位数)

题解: class Solution { public: double findMedianSortedArrays(vector& nums1, vector

jenkins使用jacoco插件检测代码覆盖率(八)

代码覆盖率:类覆盖,方法覆盖,行覆盖,指令覆盖……(简而言之,就是判断有没有被执行) 覆盖率 = 已经执行的代码 / 总代码 (1)创建maven项目,配置pom.xml如下 pom.xml < ...

你可能感兴趣的:(c语言野指针导致问题)