linux c 指针和内存分配内存,linux-C基础系列-内存管理(野指针).md

野指针概述

野指针通常指的是指针变量中保存的值不会死一个合法的内存地址,但又对其访问。需要注意的是野指针不是空指针,而是指向内存不可用的指针。

C语言中对于空指针(NULL)是可以判断出来的,但是野指针是无法判断一个非空指针是否为野指针。

野指针一般的来源如下:

局部指针变量没有初始化

#include

int main()

{

char *p;

strcpy(p,"haha"); // 野指针

return 0;

}

使用已释放的指针

int main()

{

int *p = (int *)malloc(sizeof(int)*5);

free(p);

*p = 1; // 野指针

return 0;

}

指针所指向的内存空间在使用前被销毁

#include

char *fun()

{

char p[] = "haha";

return p;

}

int main()

{

char *p = fun();

printf("%s\n",p); // 野指针

return 0;

}

指针经典错误

①被指向的变量没有初始化

②没有为指针指向的内存分配足够的内存

struct Demo

{

int *p;

}

int main()

{

struct Demo d1,d2;

int i;

for(i = 0; i < 10; i++){

d1.p[i] = i; // 未初始化

}

d2.p = (int *)calloc(5,sizeof(int));

for(i = 0; i < 10; i++){

d2.p[i] = i; // 越界,没有分配足够的空间

}

free(d2.p);

return 0;

}

内存分配成功但没有初始化

#include

#include

int main()

{

char *s = (char *)malloc(10);

printf("%s\n",s); // 字符串以 '\0' 为结束符,如不初始化,则未知 '\0'在哪。

free(s);

return 0;

}

数组越界

#include

void fun(int a[10])

{

int i;

for(i = 0; i < 10 ;i++){

a[i] = i; // 越界

printf("%d\n",a[i]);

}

}

int main()

{

int a[5];

fun(a);

return 0;

}

内存泄漏

void fun(unsigned int size)

{

int *p = malloc(sizeof(int) * size);

int i;

if(size % 2 != 0){

return ; // 未释放已申请的内存

}

for(i = 0; i < size ;i++){

p[i] = i;

printf("%d\n",p[i]);

}

free(p);

}

此处可表明,函数设计时最好是单入口单出口。

多次对指针进行内存释放

void fun(int *p,int size)

{

int i;

for(i = 0; i< size; i++){

p[i] = i;

printf("%d\n",p[i]);

}

free(p);

}

int main()

{

int *p = (int *)malloc(5 * sizeof(int));

fun(p,5);

free(p); // 多次释放

return 0;

}

此处可以表明在进行内存操作时,其原则是“谁申请,谁释放”,并且在释放后对指针置空。

使用已释放的指针

void fun(int *p,int size)

{

int i;

for(i = 0; i < size ;i++){

printf("%d\n",p[i]);

}

free(p);

}

int main()

{

int *p = malloc(5 * sizeof(int));

int i = 0;

fun(p,5);

for(i = 0;i < 5 ; i++){

p[i] = i; // 内存空间已释放

}

return 0;

}

内存使用一般规则

① 使用malloc等申请内存后,必须立即检查返回值是否为NULL;

② 牢记数组长度,防止越界操作,可考虑使用柔性数组;

③ 内存申请和释放操作必须匹配,防止内存泄漏也可防止多次释放;

④ 如必须在某个函数中释放一个内存,则建议添加一个参数选项,来显式提醒调用者是否释放内存;

⑤ free后立即将其赋值为NULL,因为free的参数为空时是合法参数;

email: MingruiZhou@outlook.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net怎么调用fastreport报表_财务分析-企业财务管理报表模板制作实现智能化的财务运营...

随着我国经济的不断发展&#xff0c;企业在市场环境中的竞争压力也越来越大&#xff0c;只有具备充足的活力和竞争力的企业才可以在竞争激烈的市场环境中处于不败之地。财务分析作为企业财务管理的重要手段之一&#xff0c;它能够为企业的一切财务活动提供必要的依据&#xff0…

通达OA general/appbuilder/web/portal/gateway/moare接口存在反序列化漏洞 附POC软件

@[toc] 通达OA general/appbuilder/web/portal/gateway/moare接口存在反序列化漏洞 附POC软件 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与…

谈谈两种标准库类型---string和vector

两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型&#xff0c;string表示可变长的字符序列&#xff0c;vector存放的是某种给定类型对象的可变长序列。 一、标准库类型string 1.定义和初始化string对象&#xff1a;初始化string对象的方式有 strin…

linux编译ffmepg,在Ubuntu下编译FFmpeg

在之前&#xff0c;我们成功地使用mingwmsys在Windows平台下编译FFmpeg(见 http://www.linuxidc.com/Linux/2014-11/109839.htm)&#xff0c;并生成了ffplay.exe。现在再在Ubuntu平台上重新编译一次。相对于在Windows平台上编译需要的旷日持久而且异常艰难的工作&#xff0c;Ub…

C++为什么空格无法输出_47个快捷键、50个CAD技巧,终于知道为什么别人用CAD总比我快了!...

终于知道为什么别人用CAD总比我快了&#xff0c;原来他们早就掌握了这些实用的CAD技巧&#xff0c;还没看完我就默默地转了&#xff0c;总有用得到的时候。47个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷方式…

Flume环境搭建_五种案例(转)

Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example configuration file, describing a single-node Flume deployment. This configuration lets a user generate events and subsequently logs them to the con…

linux配置服务器超时退出,Linux下实现不活动用户登录超时后自动登出

摘要&#xff1a;方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件...方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件来实现。这两个文件选择其中一个…

只读属性怎么来的初值_设置Mysql表只读,关键时刻或许能救你一命

作为一名数据库运维人员&#xff0c;应该遇到过表记录被异常全表更新&#xff0c;这个时候该怎么办。作为Mysql数据库运维人员&#xff0c;第一反应&#xff0c;应该就是上报&#xff0c;然后联系开发人员&#xff0c;确认此表作用&#xff0c;然后再确定恢复方案。在这里举一个…

天龙架设linux环境配置,《果子资源》-天龙八部-手工纯端架设教程 - T-天龙八部 - Powered by Discuz!...

宝塔纯端架设天龙八部3D教程1.我这边使用CENOTS7 系统(6系统没时间测试)2.安装宝塔3.进入宝塔 安装MySQL5.5(我这边测试MYSQL 5.7 会创建不了角色) PHP 和NGINX3.进入SSH 输入yum install unixODBC -y4. 添加mysql账号账号: app_mtlbb密码: dskfjl29091dfk导入sql目录里的数据库…

mac安装需要的骚操作

显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool true; KillAll Finder 允许任何来源sudo spctl --master-disable 安装command line toolsxcode-select --install 使用locatesudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.pl…

自动打包linux,Linux环境下Springboot自动打包发布功能

实现核心功能&#xff1a;完成Linux环境下Springboot自动打包发布功能详细功能&#xff1a;自动更新Svn最新代码删除原有打包文件自动打包将打包之后的项目文件复制到其他服务器关闭本地项目进程重新启动本地项目服务使用到的相关技术&#xff1a;SVN&#xff0c;Maven&#xf…

miui12怎么自定义开机动画_MIUI12正式发布:视觉/功能大升级

点击上方蓝字【安兔兔】关注我文章每天不断更&#xff01;在今天下午举行的线上发布上&#xff0c;小米正式发布了MIUI12系统。从官方描述来看&#xff0c;MIUI12可以说是MIUI近几年来最重磅的一次更新&#xff0c;在UI界面、动画以及功能等方面都作出了升级。按照官方说法&…

已触发了一个断点 vs_VSCode源码分析-断点调试

背景今年年初&#xff0c;有幸参与了阿里集团IDE 共建项目组&#xff0c;打造阿里生态体系内的公共IDE底层&#xff0c;而作为一款面向开发者的IDE&#xff0c;调试能力的支持一定程度上决定着一款IDE的开发体验&#xff1b;VSCode作为微软体系下一款当前最热的IDE开发工具&…

什么端口可以抓LINUX,linux下开启某个端口的方法:可用于SQL

php生成随机字符串SDUST 软件工程2016-作业4-A 百钱买鸡问题解决百钱买鸡问题原本并不困难,关键的是这道题对其进行了升级,测试数据太大,传统的解法,像三重循环,二重循环都会导致超时. 这道题正确的解法应该是结合数学方程进行化简,将其转化为1层循环: xyz ...BootStrap最常用的…

azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?

MikeWo..7我还没有使用过Linux的IaaS实例,但我想我可以根据我对基础设施如何工作的理解来回答其中一些问题.当您创建VM时,您拥有操作系统磁盘(它映射到上面的根目录,我相信启动也可以,但我认为这是一个基于Linux的工件,并且在使用Windows时不存在).此OS磁盘作为VHD,页面BLOB存储…

python网页爬虫循环获取_Python 爬虫第三篇(循环爬取多个网页)

本篇是 python 爬虫的第三篇&#xff0c;在前面两篇 Python 爬虫第一篇&#xff08;urllibregex&#xff09; 和 Python 爬虫第二篇&#xff08;urllibBeautifulSoup&#xff09; 中介绍了如何获取给定网址的网页信息&#xff0c;并解析其中的内容。本篇将更进一步&#xff0c;…

移动web——touch事件介绍

基本概念 1、在移动web端点击事件或者滑动屏幕、捏合等动作都是由touchstar、touchmove、touchend这三个事件组合在一起使用的 2、click事件在移动端会有0.2秒的延迟&#xff0c;下面是测试click在移动web端的延迟&#xff0c;最好在手机浏览器中测试 <script>window.onl…

如何计算一年总共有多少周_一年有几个周?怎么计算周数及闰年?

用这一年的天数除以7。因为一周有七天。分析过程如下&#xff1a;假设这一年是2018年&#xff0c;2018年是一个平年&#xff0c;因为2018/4504……2。平年的全年有365天&#xff0c;365752……1。由此可得2018年有52周多1天。扩展资料&#xff1a;闰年的计算方法&#xff1a;1、…

linux系统安装应用商店失败,在Deepin/UOS系统应用商店中安装KiCad失败的解决方法...

在Deepin/UOS系统应用商店中搜索并安装KiCad可能会提示安装失败&#xff0c;原因就是缺少必要的依赖包及KiCad的封装库文件。下面分享解决方法及附上Deepin系统安装KiCad5的方法。参考深度商店应用Inkscape、KiCad、MyPaint、中望CAD Linux预装版。解决方法在系统中通过终端执行…

在Oracle中利用SQL_TRACE跟踪SQL的执行

当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢? Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被 输出到trace文件中. 下面用例子来跟踪一个SQL语句的执行情况: SQL> create table t as select rownum as id,o…