野指针和free总结超有用

news/2024/7/20 13:38:41 标签: 指针, 链表, 内存管理, c语言

在C语言项目中,经常会遇到需要程序员手动分配内存的地方。这样做能够节省大量的内存空间,也让程序更加灵活。只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合。这个组合使用起来有一个需要注意的地方,不知道你有没有发现。
指针是什么?
根据百度百科的说法,野指针是指 指向一个已删除的对象或未申请访问受限内存区域的指针.
我这里是这样理解的,野指针就是指向的内存区域不合法,这里的不合法主要包括以下几个方面:

  1. 所指向的内存未申请
    2.所指向的内存被释放
    当你访问一个未申请的内存区域时,系统会判定我们没有权限,无法访问。内存被释放后你再访问,结果完全不可预知,很大几率会出现段错误(segmentation fault),这是提示你访问越界了。
    指针怎么出现的?
    在代码中以下几种情况会出现野指针
    1.指针声明后未初始化
    这种情况下编译器一般会给出一个 warning警告,自己要注意避免。
    2.指针指向的空间被free后,没有被重置为NULL,或者指向一个有效的内存区域、
    在free后要及时处理被free的指针,例如令其指向NULL。
    指针该如何避免?
    1.在指针声明时,要养成将其初始化的习惯。如下:
    int *p = NULL;
    默认将其初始化为NULL
    2.在free后面,加上重置指针的代码,如下:
    free§;
    p = NULL;
    重置为NULL
    为了便于理解,下面贴上一份代码:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

int main(int argc,char *argv[])
{

char *p = NULL;  //初始化为NULL
p = (char *)malloc(100);
if(p==NULL)
{
	return 0;
}
strcpy(p,"12321323213");  //向内存拷贝值
printf("p : %s\n",p);     //打印值

if(p!=NULL) 
{
	free(p);
	p = NULL;  //在释放完后,再将指针的值置为空
}

//free释放的是指针所指向的内存空间,而不是指针的值。
//所以释放后指针还是指向原来的地址
if(p1!=NULL)
{
	free(p1);  //如果再次释放,就会出现野指针错误。
}
getchar();
return 0;

}

参考学习资料
指针
http://www.makeru.com.cn/live/1392_238.html?s=45051
C语言控制led灯
http://www.makeru.com.cn/live/1392_304.html?s=45051
输入和输出
http://www.makeru.com.cn/live/1758_312.html?s=45051
C语言玩转链表
http://www.makeru.com.cn/live/1392_338.html?s=45051


http://www.niftyadmin.cn/n/1323104.html

相关文章

程序员工作两年 插本_华为程序员想离职,当收到刚发的年终奖后:我要不要再干一年?...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注&#xff1a;本文转载自网络&#xff0c;不代表本平台立场&#xff0c;仅供…

sql 随机数_SQL如何快速新增百万测试数据?

之前我在公众号&#xff08;SQL数据库开发&#xff09;里大致的说了一下&#xff0c;就是通过数据库的自增长ID和重复往自己表里插入数据可以快速获得我们想要的测试数据。今天再说一点不一样的。1、建立基础数据使用Excel下拉自动填充功能&#xff0c;可以快速得到我们想要的一…

python实现端口转发_Python实现TCP/IP协议下的端口转发及重定向示例

首先&#xff0c;我们用webpy写一个简单的网站&#xff0c;监听8080端口&#xff0c;返回“Hello, EverET.org”的页面。然后我们使用我们的forwarding.py&#xff0c;在80端口和8080端口中间建立两条通信管道用于双向通信。此时&#xff0c;我们通过80端口访问我们的服务器。浏…

基于python的分类预测_基于scikit-learn机器学习库的分类预测

摘要&#xff1a; 在Python中如何使用scikit-learn模型对分类、回归进行预测&#xff1f;本文简述了其实现原理和代码实现。一旦你在scikit-learn中选择好机器学习模型&#xff0c;就可以用它来预测新的数据实例。初学者经常会有这样的疑问&#xff1a;如何在scikit-learn中用我…

micropython遵循的是什么开源协议_ueos

MicroPython1、介绍这是一个在 RT-Thread 上的 MicroPython 移植&#xff0c;可以运行在 RT-Thread 3.0 版本以上。通过该软件包可以在搭载了 RT-Thread 的嵌入式系统上运行 MicroPython。如果是第一次接触 RT-Thread MicroPython&#xff0c;推荐你先通过 RT-Thread 官方支持的…

零基础小白看过来要如何利用指针间接赋值

我们都知道&#xff0c;指针是指向一段内存空间的。而这个内存空间也可以存放下一个内存空间的地址&#xff0c;这样一级级的传递下去&#xff0c;就变成了多级指针。在C语言中&#xff0c;多级指针是经常会用到的。 多级指针像一把双刃剑&#xff0c;有利也有弊。你能够用它完…

解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题

今天在写简单的TCP通讯例子的时候&#xff0c;遇到了一个问题:server 和client能够连接成功&#xff0c;并且client也能够正常发送&#xff0c;但server就是接收不到&#xff0c;在网上搜索一番后&#xff0c;终于解决了问题。在这里整理如下&#xff1a; 大家要注意的是&…

c语言编程基础入门必备资料

数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单精度浮点型存放精度不高的小数double双精度浮点型存放精度较高的小数 除了这些基本数据类型之外,…