c语言 malloc_C语言快速入门——动态内存分配

在前面一系列的字符串操作中,我们都是先定义一个固定大小的字符数组,然后根据所需,或拷贝、或连接、或格式化来为这个数组提供内容。固定大小的数组意味着在程序运行期间,数组所占用的内存是确定的(即划分了固定数量的内存),很多时候,这种方式简单好用。但是由固定二字也可以看到,这种方式也让它失去了灵活性。

假定我们现在要从磁盘上加载了一个新闻文件,那么,我们应该定义一个多大的字符数组才能保证完全容纳新闻内容呢?显然,这个大小很难确定。小了,内容会读取不全;大了,会浪费更多的内存。假如说我们有方法获得新闻内容的长度,然后分配同等大小的缓冲区(即字符数组),这该多完美!这便是动态内存分配一展身手的地方了。

malloc:动态分配指定数量的存储空间

b130cccf3a572a027aacba80fc689995.png
87fc919f6f81896beb6421fc66c04ee0.png

我们秉承的是由简单到复杂的原则,因此这个示例仅用于说明malloc函数的使用。对于这种仅分配一个整数的情况,使用malloc完全不划算,不如直接定义一个变量简单好用。

free:释放malloc分配的存储空间

抛开虚拟内存等机制,计算机系统内存是有限的,如4GB、8GB。malloc用于向系统申请一定数量的内存,如果你的程序一味的申请内存供自己使用,那么系统可分配给其它程序的内存就会减少,到最后无内存可用,最终导致系统运行缓慢,不稳定等问题。显然,这种只索取不奉献的行为是不可取的因此,C语言提供了free函数,用于向系统返还借用的内存。

当你忘记使用free释放由malloc分配的内存时,表明程序存在”内存泄露“这一顽疾,因此对于上面的程序,我们在return 0之前,使用下面的代码进行完善。

1ce91c4c11f60c36baf0d962ec94bb35.png

动态数组

在实际开发中,像第一个示例那样为单个数据动态分配内存的情况很少见。更多时候,我们是分配一整块内存空间供程序使用。一整块所暗含的另一个意思就是这块内存区域中的地址是连续的,这一整块数据区域也可以称为缓冲区(buffer)。现在让我们回过头来解决文章开始提出的问题。

d67a4629ed53aee3704dfbac944fd829.png

新闻的内容长度是58个字节,这是我提前使用strlen()测试出来的。因为C语言要求字符串必须以'0'结尾,因此我们在使用malloc分配内存时多分配了一个字节,用以存储这个标记。strcpy_s在拷贝完成后,会在目标串(message)后追加结束标记,因此不需要手动设置标记。

你可以尝试将例子中lengt+1全部变为length,再次运行时程序会中断,因为分配的缓冲太小了——只能够存储字符串,不能够存储最后一位结束符标记。

d2bde11df0c133a93bd3b2df883fbbec.png

最后要说明的是:事实上malloc返回的地址类型是void*,但是在C语言环境中,可以由一个确切的类型直接持有此地址,如

int *pa = malloc(sizeof(int));

但是,通常为了通用性,建议将返回类型强制转换为对应的类型:

int *pa = (int*)malloc(sizeof(int));

这便是内存动态分配了!

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

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

相关文章

FFMPEG设置 cbr讨论

Q:我采用ffmpeg调用x264一直出错,命令如下ffmpeg -s 352x288 -r 50 -pix_fmt yuv420p -i tmp.yuv tmp.h264可不可以给点建议,找了很久也没有找到解决办法,错误时error while opening encoder for output stream 0.0 maybe incorrect parame…

博文声明

本博客用于分享学习笔记 欢迎大神指正,我们互相学习交流,共同成长进步! 博客首页:秋叶夏风的博客

【经验分享】工程开发与Coding规范

今天分享分为两部分 :) PART01 工程开发代码规范分享/ PART02 关于某易云自动签到听歌分享- 5Mins DevCoding Rule: PART 1 了解真实工程开发🏗..... 本篇内容分享的宗旨: 学长工作经验之谈仅作分享🏷 Ready,Go 代码管理——工具篇 •工程上首先需要…

过滤器与拦截器区别

过滤器与拦截器区别 参考:http://www.cnblogs.com/dreamroute/p/4198087.html?utm_sourcetuicool 过滤器 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。它是随你的web应用启动而启动的,只初始化一次,以后就…

二进制-高效位运算

数独 数独是介绍位运算的好例子,运用位运算和不运用效率差别还是挺大的。我们先看数独需求: 1、当前数字所在行数字均含1-9,不重复 2、当前数字所在列数字均含1-9,不重复 3、当前数字所在宫(即3x3的大格)数字均含1-9&a…

pytorch resnet50_PyTorch终于能用上谷歌云TPU,推理性能提升4倍,我们该如何薅羊毛?...

晓查 发自 凹非寺量子位 报道 | 公众号 QbitAIFacebook在PyTorch开发者大会上正式推出了PyTorch 1.3,并宣布了对谷歌云TPU的全面支持,而且还可以在Colab中调用云TPU。之前机器学习开发者虽然也能在Colab中使用PyTorch,但是支持云TPU还是第一次…

x264里的2pass指的是什么意思? x264源代码分析2.encode()

A:x264里的2pass指的是什么意思?另外stat是什么意思, 比如有个参数--stats <string> Filename for 2 pass stats [/"%s/"]/n", defaults->rc.psz_stat_out );stats在这是什么意思? 2pass是2次编码的意思&#xff0c;stats是统计文档的名称&a…

项目启动居然如此重要!

项目的启动阶段比较短&#xff0c;项目经理往往容易忽视这个阶段&#xff0c;但是&#xff0c;项目的启动却具有着重要的意义。 定基调&#xff1a; 基调包括工作的节奏、团队氛围和沟通风格等。 一首歌的第一句决定了这首歌的基调&#xff0c;如何唱好这第一句就是项目启动所要…

mysql数据库导入导出文件sql文件

window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u dbuser -p dbname users> dbname_users.sql 3.导出…

Android Studio主题设置、颜色背景配置

2019独角兽企业重金招聘Python工程师标准>>> color-themes 效果展示 打开http://color-themes.com/有很多样式可供选择 1. Monokai Sublime Text 3(color theme) 2. Solarized Light (color theme) 3. Visual Studio 2015 Dark(color theme) 导入方式 下载主…

JavaScript中的函数

js函数 *第一种是使用function语句定义函数 function abc(){alert(abc); }*第二种是在表达式中定义函数 var 函数名 function\(参数1&#xff0c;参数2&#xff0c;…\){函数体};//例如&#xff1a;//定义var add function\(a,b\){return ab;}//调用函数document.write\(a…

x264源代码分析1。fread()

相关说明:1. 使用版本: x264-cvs-2004-05-11 2. 这次的分析基本上已经将代码中最难理解的部分做了阐释,对代码的主线也做了剖析,如果这个主线理解了,就容易设置几个区间,进行分工阅读,将各个区间击破了. 3. 需要学习的知识:a) 编码器的工作流程.b) H.264的码流结构,像x264_sp…

在centos下安装pycrypto报错 RuntimeError: autoconf error

解决&#xff1a;yum -y install gcc File "/usr/lib64/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/usr/lib64/python3.6/distutils/command/build.py", line 135, in run self.run_command(cm…

Java多线程实现异步调用

在Java平台,实现异步调用的角色有如下三个角色&#xff1a;调用者、 提货单 、真实数据&#xff0c;一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕&#xff0c;不需要等蛋糕做出来(假设现做要很长…

sql server 2008 r2卸载重装_免费下载:Intouch软件、Windows操作系统、SQL数据库,VB6.0、C#...

为大家整理了常用的Windows操作系统和安装软件&#xff0c;基本上都是经过我们项目测试OK的版本&#xff0c;以后项目调试就齐全了&#xff0c;不用再“东奔西走”&#xff0c;“小鹿乱撞”了。整理不易&#xff0c;若对您有帮助请关注并转发&#xff0c;以便帮助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar简介 ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、灵活性、具有Material Design风格等优点&#xff0c;越来越多的应用也用上了ToolBar&#xff0c;比如常用的知乎软件其顶部导航栏正是使用ToolBar。官方考虑…

【零散积累】传输文件(sz/rz/scp命令)

来自wiki迁移页面路径&#xff1a;刘旺的主页 / 个人零散积累 / 01> 传输文件&#xff08;sz/rz/scp命令&#xff09; 工作中的传输文件会出现在linux之间&#xff0c;或者linux与windows之间。 一、怎么实现linux与windows之间的文件传输&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成将已编码数据参数和待编码数据装入到h->mb.cache中,下图是BUF中存储的数据在以MB为单位的时候的存储顺序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把当前宏块的up宏块和left宏块的intra4x4_pred_mode&#xff0c;non_zero_count加载进来&#xff0c…

U(优)盘安装FreeBSD-9.0+GNOME_lite桌面

贴图在我的主页&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修订于&#xff1a;2012/07/04 标题&#xff1a;U(优)盘安装FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0启动XP(Windows)、FreeBSD、Ubuntu(Linux)三系统 【黑括号表示说明&#xff0c;中…

【零散积累】 vim常用操作

类型 操作 含义 删除 dd 删除游标所在的一整行(常用) ndd n为数字。删除光标所在的向下n行&#xff0c;例如20dd则是删除光标所在的向下20行 d1G 删除光标所在到第一行的所有数据 dG 删除光标所在到最后一行的所有数据 d$ 删除光标所在处&#xff0c;到该…