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

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

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

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

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

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

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

动态数组

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

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

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

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

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

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

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

这便是内存动态分配了!

c语言 malloc_C语言快速入门——动态内存分配相关推荐

  1. C语言数组用到的动态内存分配

    动态内存分配 在学习数组的过程中,在输入数组时,原本想过scanf定义数组的大小再输入数组的各值,却报错. 发现原因: 1.定义数组的时必须指定数组长度 2.数组长度是在编译期就必须决定的 所以此时需 ...

  2. C语言第十三课,动态内存分配

    动态内存分配的空间放在堆区.动态内存函数主要有:malloc,calloc,realloc 动态内存函数的介绍 malloc 申请一个空间,大小是size的大小,指向的一个类型不明,因为在设计的时候, ...

  3. c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析

    为什么C语言要动态分配内存的意义? 1.C语言中的一切操作都是基于内存的 2.变量和数组都是内存的别名 ---内存分配由编译器在编译期间决定的 ---定义数组的时候必须指定数组长度 ---数组长度是在 ...

  4. Dart语言——45分钟快速入门(下)

    类和对象 类的定义 // Dart中定义一个类 class Person {String name;int age;Person(String name, int age) {this.name = ...

  5. html超文本标记语言初级,超文本标记语言HTML之快速入门HTML简介、HTML入门

    作为准备开始学习ASP.net的新手或者开发Internet应用程序的新手,诸如:PHP.Java等等,最基本的网页编程一定要掌握,新手往往出于急迫的心情与现实的考虑,不少人没有扎实的基础就想直接学习 ...

  6. Dart语言——45分钟快速入门(上)

    文章目录 前言 视频课程 环境准备 安装Dart SDK 配置环境变量 配置 VSCode 编辑器 测试环境 基础语法 代码注释 内置数据类型 变量与常量 定义变量 定义常量 内置类型的常用操作 数值 ...

  7. rust放置木箱转向_[易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]...

    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...

  8. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. c语言动态内存分配数组,【C】动态内存分配

    ## 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组长度是在编译期就必须确定的需求: 程序在运行过 ...

最新文章

  1. 非计算机专业的人要如何学python?
  2. Class.getResources()和classLoader.getResources()区别
  3. win10下安装PHP_CodeSniffer 检查编码规范
  4. 深刻好文|关于资产与负债的思考(国庆活动开启)
  5. C#格式化字符串净化代码的方法
  6. 令人迷惑的硬币翻转(洛谷P1146题题解,Java语言描述)
  7. SpringMVC错误:No mapping found for HTTP request with URI [xxxx] in DispatcherServlet
  8. 音视频即时通讯开发功能介绍
  9. C语言课程设计-车辆信息管理系统
  10. mysql的R树_R*树
  11. 免费版的进销存管理软件可以用吗
  12. python找色_利用python检测色情图片简易实例
  13. 案例分享:陕西西安599条背街小巷改造提升,推行“多杆合一”
  14. 购买计算机网络设备的会计分录,企业购买设备的会计分录怎么写?
  15. Java Socket详解+基础模板+各种常见问题+端口映射
  16. 大文件的切割与归并(数据分析案例三)
  17. ai人工智能软件开发模式介绍
  18. WinSCP连接Linux
  19. 什么是赛顿? Python以C的速度
  20. php ppt转视频教程,如何制作ppt转换视频新手教程操作指南

热门文章

  1. 通过8个技巧让你成为一个超强的Linux终端用户
  2. 如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
  3. [C# 网络编程系列]专题十二:实现一个简单的FTP服务器
  4. CentOS MySQL 5.7编译安装
  5. Python爬虫入门之Urllib库的基本使用
  6. IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中
  7. 学习ecshop 教程网址
  8. ASP.NETLinkButton的Click事件中获取CommandArgument的值
  9. C#.NET中的事件2
  10. 游戏开发中的数学和物理算法(7):角度 vs 弧度