为什么C语言要动态分配内存的意义?

1.C语言中的一切操作都是基于内存的

2.变量和数组都是内存的别名

---内存分配由编译器在编译期间决定的

---定义数组的时候必须指定数组长度

---数组长度是在编译期就必须确定的

需求:程序运行的过程中,可能需要使用一些额外的内存空间

实际使用就是malloc和free函数

用于内存的分配和释放

1.malloc所分配的是一块连续的内存

2.malloc一字节为单位,并且不带任何的类型信息

3.free用于将动态内存归还系统

void* malloc(size_t size)

void free(void* pointer)

注意:

1.malloc和free是库函数,不是系统调用

2.malloc实际分配的内存可能会比请求的多---有些编译器分配时是以4字节为单元的

3.不能依赖于不同平台的下的malloc

4.当请求的动态内存无法满足时malloc返回的是NULL

5.当free的参数为NULL时,函数直接返回

思考一个问题:malloc*(0);返回值是什么?*(这也是一个面试题)

#include 

引出一个问题,这里不停的malloc,但是不free会造成内存泄露吗?

答案是会的,因为现代编译器一般是分配的4个整数字节,也就是申请的是0。但是实际分配的可能是4

解决的方式是:高级语言的(Java,.net.python等都是有内存回收功能的)

不过嵌入式基本都是使用C语言的(我做无人机的时候使用的是c++),那就得解决

下边是一个实际操作---内存泄露检测模块

gcc 38-1.c mleak.c (编译需要的所有文件)

#include 

怎么实现内存检测的呢?

mleak.c函数

#include 

mleak.h

#ifndef _MLEAK_H_

新概念

calloc和realloc

1.malloc的同胞兄弟

void* calloc(size_t num,size_t size);

void* realloc(void* pointer,size_t new_size);

2.calloc的参数代表所返回的内存的类型信息

---calloc会将=返回的内存初始化为0

3.realloc用于修改一个原先已经分配好的内存块的大小

---在使用realloc之后应该使用期返回值

---当pointer的第一个参数时NULL时,等价于malloc

实例使用:

#include 

小结:

1.动态分配内存是C语言的强大功能

2.程序能够在需要的时候有机会使用更多的内存

3.malloc单纯的从系统中申请固定字节大小的内存

4.calloc能以类型大小为单位申请内存并初始化为0

5.relloc用于重置内存大小

说明

1.该文档仅供个人学习使用,版权所有,禁止商用。

2.本文由我一个人编辑并整理,难免存在一些错误。

3.为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,该教程同步更新于微信公众号『Allen5G』。

我的微信公众号(ID:Allen5G)主要分享软件工程师进阶(嵌入式,Linux,C/C++,python,英语),程序员职业发展,如果想查看更多内容,可以关注我的微信公众号『Allen5G』

c语言遍历文件内容_C语言学习第28篇---动态内存分配剖析相关推荐

  1. c语言遍历文件内容_C/C++编程笔记:C语言开发电脑益智游戏【扫雷】(源代码分享)...

    咱们先和大家说好,本次C语言开发的扫雷游戏是通过Easy X实现的,但是很多和我一样的新手,一开始不知道Easy X是什么,到时源码拿过去写之后,运行报错.Easy X是很多和我一样的新手在学习的时候 ...

  2. c语言清空文件内容_C 语言清空输入缓冲区的几个手段

    先观察如下代码和运行情况: 按照控制台提示,输入 value 的值之后,本该能够按照提示继续输入 choice 的值.但是你会发现程序直接跳过了 choice 的输入.而且 choice 原本的值是 ...

  3. c语言遍历文件内容_编程语言安全性排行榜:Ruby 最佳,C 语言漏洞最多

    来源|WhiteSource 译者|田晓旭 编辑|Debra AI 前线导读:IT 技术圈有一个永远无解且有争议性的问题,那就是"谁是最好的编程语言?"事实上,由于各种编程语言的特 ...

  4. C++ Primer Plus学习笔记之类和动态内存分配

    前言 个人觉得学习编程最有效的方法是阅读专业的书籍,通过阅读专业书籍可以构建更加系统化的知识体系. 一直以来都很想深入学习一下C++,将其作为自己的主力开发语言.现在为了完成自己这一直以来的心愿,准备 ...

  5. c语言遍历文件内容_跨平台的C语言网络框架库acl

    acl概述 acl (全称Advanced C Library)是一个跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的网络通信库及服务器编程框架,同时提供更多的实用功 ...

  6. C语言读取文件内容,保存到数组里面

    前言 本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出. 另一部分使用C语言编程实现读取文件内 ...

  7. STM32Fatfs遍历文件(C语言实现)

    两种方法二选一:  //遍历文件 //path:路径 //返回值:执行结果 u8 mf_scan_files(u8 * path) {FRESULT res;char *fn; /* This fun ...

  8. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  9. c语言指针官方解释_C语言中的指针解释了–它们并不像您想象的那么难

    c语言指针官方解释 Pointers are arguably the most difficult feature of C to understand. But, they are one of ...

最新文章

  1. Spring Boot 2.4.5、2.3.10 发布
  2. python入门到精通需要学多久-从Python入门到精通,你只需要在马哥教育待四个月...
  3. java实现混合运算_java图形化界面实现简单混合运算计算器
  4. BERT在多模态领域中的应用
  5. 真的!最难啃的《深度学习》圣经花书,居然新出版了视频课!
  6. (z) 傅里叶分析之掐死教程(完整版)
  7. Video视频背景设计企业模板
  8. MVC SignalR Hub实时聊天实时Web解决方案
  9. 如何允许远程连接到MySQL
  10. [C#]使用EasyHook注入ws2_32.dll,实现send和recv拦截数据封包
  11. 中小制造型企业如何成功实施5S管理?
  12. top在linux的命令,Linux命令详解之–top命令 | Linux大学
  13. java创建临时文件
  14. Kali使用中文输入法
  15. thymeleaf中数字的日期格式以及货币格式
  16. 电游入侵传统教育,用练级学习
  17. java 发送网易邮箱邮件
  18. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1
  19. 论文阅读笔记markdown模板
  20. 5大好用又免费BI软件系统

热门文章

  1. 安装php no permision,php安装过程中的No package ‘xxx’ found问题
  2. java读取邮箱附件_使用javamail获取附件内容
  3. oracle 结果集已耗尽_java.sql.SQLException: 结果集已耗尽
  4. linux划分root_vg,為Linux添加新硬盤,划分LVM分區
  5. mysql数据库sql注入原理_SQL注入原理解析以及举例1
  6. Linux Unbunt 安装显卡驱动 简单方法
  7. 将z-blog改成英文blog所遇到的问题
  8. swing皮肤包 substance
  9. 二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...
  10. 移动端适配方案(上)