C语言之内存管理(十七)(转世灵童现世)

news2025/1/31 3:16:20

上一篇: C语言入门篇之轮回法器(十六)(指针第五卷)

逐梦编程,让中华屹立世界之巅。
简单的事情重复做,重复的事情用心做,用心的事情坚持做;


文章目录

  • 前言
  • 一、内存管理具体介绍
    • 1.作用域
    • 2.生命周期的定义
    • 3.局部变量
    • 4.静态局部变量
    • 5.全局变量
    • 6.静态全局变量
    • 7.上述所有总结
  • 二、程序内存分布(图解示例)
  • 二、静态函数
  • 四、memset函数(内存设置)
  • 五、memcpy函数(内存拷贝)
  • 六、memcmp函数(内存比较)
  • 七、动态内存分配
    • 1.malloc函数(向堆区申请空间)
    • 2.free函数(释放申请空间的内存)
  • 总结
  • 新壁纸


前言

就一个C语言程序而言,内存空间主要是由五个部分组成划分: 代码段(text)、数据段(data)、未初始化数据段(bss),堆(heap) 和 栈(stack) ,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统默认分配的。


一、内存管理具体介绍

1.作用域

变量起作用的范围;

2.生命周期的定义

什么时候开辟空间(出生),释放空间(死亡),这个过程叫生命周期;

3.局部变量

作用域: 在定义变量的{}之内有效;
生命周期:程序运行至变量定义处开辟空间,所在的函数结束之后释放空间;
未初始化时候的值:随机数;

4.静态局部变量

作用域: 在定义变量的{}之内有效;
生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间;
未初始化时候的值:0;

5.全局变量

作用域: 整个程序,所有文件;
生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间;
未初始化时候的值:0;

6.静态全局变量

作用域: 当前文件;
生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间;
未初始化时候的值:0;

7.上述所有总结

作用域:
局部变量(普通局部和静态局部)在{}范围之内 ;
普通全局变量作用域在整个工程 ;
静态全局作用当前文件;

生命周期: 只有普通局部是运行至变量定义处时开辟,函数结束释放,其他变量都是执行main函数之前就已经开辟空间,程序结束之后才释放空间;

初始化的值: 只有普通局部未初始化的值为随机,其他为0;

二、程序内存分布(图解示例)

在这里插入图片描述

二、静态函数

静态函数就是在函数定义时加上static修饰的函数,静态函数只可以被当前文件函数调用

写法示例:
static void fun(){} ;

普通的函数没有加任何修饰,就是全局函数,整个工程可以调用

四、memset函数(内存设置)

头文件添加:
#include <string.h>
函数原型:
void *memset(void *s, int c, size_t n);
功能:将s的内存区域的前n个字节以参数c填入;
参数:
s:需要操作内存s的首地址;
c:填充的字符,c虽然参数为int,但必须是unsigned char , 范围为0~255
n:指定需要设置的大小;
返回值:s的首地址;

代码示例:

/*-----------------------------------【程序说明】----------------------------
*			 项目命题:   C语言入门篇
* 			 代码所属:   瑶池酒剑仙(枫之剑客)
* 			     作者:   阿甘
* 		     开发时间:   2021/12/11
*			IDE 版 本:   Visual Studio 2015
*		     项目版本:   1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx/article/details/128296570


int main()
{
   int  a =10;
   //a = 0;  ->  memset()
   memset(&a,0,sizeof(a));
   char buf[10] = "";
   strcpy(buf,"hello");
   printf("%s\n",buf);
   memset(buf,0,sizeof(buf));
   printf("%s\n", buf);
   //将前9个字符置为'a'
   memset(buf,'a',sizeof(buf)-1);
   printf("%s\n", buf);
   system("pause");
   return 0;
}

五、memcpy函数(内存拷贝)

头文件添加:
#include <string.h>
函数原型:
void *memcpy(void *dest, const void *src, size_t n);
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上;
参数:
dest:目的内存首地址
src:源内存首地址,注意:dest和src所指的内存空间不可重叠,可能会导致程序报错
n:需要拷贝的字节数
返回值:dest的首地址;

代码示例:

/*-----------------------------------【程序说明】----------------------------
*			 项目命题:   C语言入门篇
* 			 代码所属:   瑶池酒剑仙(枫之剑客)
* 			     作者:   阿甘
* 		     开发时间:   2021/12/11
*			IDE 版 本:   Visual Studio 2015
*		     项目版本:   1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx/article/details/128296570


int main()
{
   //将数组a中前5个元素拷贝至数组b中
   int  a[10] = {1,2,3,4,5,6,7,8,9,10};
   int  b[10] = { 0 };
   //a = b;
   memcpy(b,a,sizeof(int)*5);
   for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
   {
      printf("%d ",b[i]);  
   }
   system("pause");
   return 0;
}

六、memcmp函数(内存比较)

头文件添加:
#include <string.h>
函数原型:
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较s1和s2所指向内存区域的前n个字节
参数:
s1:内存首地址1
s2:内存首地址2
n:需比较的前n个字节
返回值:
相等:=0
大于:>0
小于:<0

代码示例:

/*-----------------------------------【程序说明】----------------------------
*			 项目命题:   C语言入门篇
* 			 代码所属:   瑶池酒剑仙(枫之剑客)
* 			     作者:   阿甘
* 		     开发时间:   2021/12/11
*			IDE 版 本:   Visual Studio 2015
*		     项目版本:   1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx/article/details/128296570


int main()
{
  char num1[] = { 1,0,3,4,5,6,7 };
  char num2[] = { 1,0,3,6,5,6,7 };
  char str1[] = "dbakf\0afnafa";
  char str2[] = "dbakf\0bfnafa";
  //memcmp遇到\0字符并不会结束,全部拷贝
  printf("%d\n", memcmp(str1, str2, sizeof(str1)));
  //strncmp遇到\0字符会结束,部分拷贝
  printf("%d\n", strncmp(str1, str2, sizeof(str1)));
  system("pause");
  return 0;
}

七、动态内存分配

1.malloc函数(向堆区申请空间)

头文件添加:
#include <stdlib.h>
函数原型:
void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定,一般使用memset初始化。
参数:
size:需要分配内存大小(单位:字节)
返回值:
成功:分配空间的起始地址
失败:NULL

2.free函数(释放申请空间的内存)

头文件添加:
#include <stdlib.h>
函数原型:
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
参数:
ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
返回值:无

代码示例:

/*-----------------------------------【程序说明】----------------------------
*			 项目命题:   C语言入门篇
* 			 代码所属:   瑶池酒剑仙(枫之剑客)
* 			     作者:   阿甘
* 		     开发时间:   2021/12/11
*			IDE 版 本:   Visual Studio 2015
*		     项目版本:   1.0.0.1
*---------------------------------------------------------------------------*/
//原文链接:https://blog.csdn.net/gzplyx/article/details/128296570


int main()
{
   //申请一个字符数组,有1024元素
   char *p =(char *) malloc(1024);
   memset(p,0,1024);
   strcpy(p,"helloworld");
   free(p+1);
   //free(p);  malloc申请的空间不可以释放两次,申请一次,释放一次
   //printf("%s\n",p);
   system("pause");
   return 0;
}

总结

以上就是今天要讲的内容,今天讲的内容比较多,需要各位好好消化,可能有些朋友会觉得奇怪,为什么动态分配内存讲的比较简洁,没有进行过多的解释,

在这里博主希望大家以实战为主,理论为辅的核心思想来做编程,这样前期进步会快很多,在有了一定的基础之后,再去深入研究理论可谓事半功倍,不然就算讲了一大堆,可能也是一头雾水,给自己徒添烦恼而已。
让复杂的编程简单化;

文末了,喜欢的小伙伴帮忙点个赞收藏下,谢谢大家的支持!

新壁纸

在这里插入图片描述

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

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

相关文章

为什么说学人工智能一定要学Python?

有很多人在问博主&#xff0c;为什么人工智能学习要用Python&#xff1f;运行速度慢不好之类的&#xff0c;今天就让博主谈谈自己的感受。 先来说说前景 随着“大数据”“云计算”“人工智能”等等科技的兴起&#xff0c;IT行业在今后三到五年将会迎来一个高速发展期。这也就意…

QT调用python传递图像和二维数组,并接受python返回值(图像)

任务目的&#xff1a; 用QT调用python代码&#xff0c;将QT读取的图像(Mat矩阵)作为参数传入python中&#xff0c;将QT的二维数组作为参数传递给python&#xff0c;python接收QT传入的图像进行计算&#xff0c;将结果返回给QT。 实现过程 1.新建QT项目 说明&#xff1a;QT的…

[Cortex-M3]-5-cache uncache

目录 1 cache的引入 2 cache的工作原理 3 cache使用限制 1 cache的引入 程序运行的流程&#xff08;很简单&#xff09;&#xff1a; 程序编译&#xff1a;存放在flash&#xff1b;程序加载&#xff1a;程序加载到内存&#xff1b;程序运行&#xff1a;指令从内存复制到CP…

【产品人卫朋】自媒体运营的5个阶段,以及增长策略

本篇内容以微信公众号为例讲解自媒体的运营策略。 建立一个快速发展的微信公众号&#xff0c;需要多长时间呢&#xff1f; 有些人在一年内就可以建立一个蓬勃发展的公众号&#xff0c;而其他人则可能需要两年、三年甚至是五年的时间。 在发展的过程中&#xff0c;你的公众号将经…

阿里工程师告诉你,0基础如何自学python进大厂

大概一年前这个朋友就想学习Python了&#xff0c;但因为工作比较忙&#xff0c;而且觉得Python肯定不太好学&#xff0c;所以一直搁置在那里。 宅家学Python 到了今年1月28日也就是大年初三的时候&#xff0c;眼看新冠肺炎疫情不会短时间结束了&#xff0c;全国各地都在严控&…

原型模式

开始原型模式前&#xff0c;我们要知道深拷贝的定义&#xff0c;因为原型模式中的克隆操作核心就是深拷贝。 深拷贝和浅拷贝 下图为浅拷贝(即是编译器的默认版本), 只拷贝了指针, 两个指针同时指向一个内存, 会有危险(a改变时b也改变, 称为别名) , 导致内存泄漏 调用strcpy复…

Qt扫盲-QTreeWidget理论总结

QTreeWidget理论总结1. 简述2. QTreeWidgetItem 简述3. 头标签4. 常用功能5. 槽函数6. 信号1. 简述 QTreeWidget 类是Qt提供了一个标准的树部件&#xff0c;该部件具有经典的基于 Item 的界面&#xff0c;每个Item都是一个 QTreeWidgetItem。这个标准的树控件不需要model/view…

文科女进德国IBM实习做程序媛,我是怎么办到的?

很快我在IBM德国区实习的第一个月就要结束了。 作为一个土生土长的文科生&#xff08;硕士语言学、本科语言学商科&#xff09;&#xff0c;现在竟在欧洲混入跨国科技公司做编程技术类实习生&#xff0c;我自己也挺意外的。 尽管只是一点点微不足道的个人经历&#xff0c;此时…

教你如何优雅的转行Python程序员,一学就会

在实际的工作中&#xff0c;我们经常发现&#xff0c;很多朋友在某一个工作中做了一段时间&#xff0c;发现自己越做越没兴趣&#xff0c;越做越不开心&#xff0c;想跳不敢跳&#xff0c;想辞不敢辞&#xff0c;最后影响了自己的本职工作&#xff0c;陷入两难的窘境。 其实&am…

【Qbot】3.加入内容审核功能

该项目计划长期进行维护更新&#xff0c;欢迎star&#xff1a;https://github.com/zstar1003/Qbot 前言 在ChatGPT上线Q群不久&#xff0c;不少人对其进行了测试&#xff0c;但随着时间的延续&#xff0c;测试话题逐渐走向失控&#xff0c;迫使我不得不紧急暂停。 对同胞素质的…

【Python百日进阶-数据分析】Day134 - plotly饼图:go.pie()实例

文章目录4.2 go.Pie() 的基本饼图4.2.1 基本饼图4.2.2 样式饼图4.2.3 使用 uniformtext 控制文本字体大小4.2.4 控制饼图中的文本方向4.2.5 甜甜圈图4.2.6 从中心拉出扇区4.2.7 子图中的饼图4.2.8 自定义颜色集的子图4.2.9 绘制面积与总计数成比例的图表4.2.10 旭日图4.2.11 Da…

电脑软件、微信多开

因为办公需要在电脑上登录 2 个微信&#xff0c;但是直接双击微信图标只有 1 个登录界面&#xff0c;无法是现实登录 2 个微信。那么怎么才能在 1 个电脑上打开 2 个微信&#xff0c;方法有四种&#xff1a;1、安装&#xff1b;2、Enter&#xff1b;3、连续点击&#xff1b;4、…

『 canvas 特效』一文教你绘制绚丽的星空背景 TS + ES6

介绍 很久没有写关于 canvas 效果的文章了&#xff0c;刚好最近又学到了一个新的特效&#xff0c;使用 canvas 绘制多层次动态星空背景&#xff0c;今天就分享给大家。首先我们依旧来看一下最终实现的效果&#xff0c;如图所示&#xff1a; 由于录制 GIF 造成失帧&#xff0c;…

实战三十三:STAMP算法实现商品推荐实战 代码+数据

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。STAMP推荐…

记录Win7系统下的node版本升级过程及后续项目启动所遇问题

目录 Windows7系统如何“安装”高版本Node 后续项目运行启动时遇到的问题 Bug &#xff1a; 背景 &#xff1a; 银行内网开发&#xff0c;接到一个新的项目开发&#xff0c;但前提因为开发所使用的云桌面更换了&#xff0c;由原来的Windows10系统降到了现在的Windows7系统&am…

【自媒体必备】AI文字转语音,支持多种人声选择,在线生成一键导出【电脑永久版】

AI文字转语音&#xff0c;支持多种人声选择&#xff0c;在线生成一键导出 软件是电脑版安装版本&#xff0c;大家根据自己安软件的习惯进行安装即可&#xff0c;安装后打开软件即可&#xff0c;且完全免费。语音选择方面就有晓晓、云扬、云希等等常用选择。点击后面的播放按钮…

腾讯大佬告诉你,写Python到底用什么IDE合适

不管你是 Python 新手还是老鸟&#xff0c;肯定纠结过一个问题&#xff1a; 到底用什么编辑器写 Python 代码好&#xff1f; 为此&#xff0c;我们调查了数十位鹅厂程序猿们爱用的 Python IDE&#xff0c;从他们对每款编辑器的看法中&#xff0c;也许能给你一点启示&#xff1…

我对程序员做副业有这几点建议

疫情这几年&#xff0c;“副业”的概念非常火。各大平台上都在说“副业赚钱”、“副业是刚需”等相关的内容、视频&#xff0c;有免费的&#xff0c;还有付费观看的。 其实在2020年疫情之前&#xff0c;大家对于“副业”并没有很关心。 从百度指数上可以明显看出&#xff0c;…

【笔记】Pade Approximations

1 pade approximations是什么&#xff1f; Pad Approximations是一种对pure delay使用常规传函进行近似替换的方法&#xff0c;matlab提供了的一个库函数pade。 在传递函数中&#xff0c;用e−τse^{-\tau s}e−τs表示纯延时pure delay环节&#xff0c;它对信号的幅值不会有任…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.2 Nacos的服务注册表结构是怎样的? 54.2.1 多级存储模型

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.2 Nacos的服务注册表结构是怎样的&#xff1f;54.2.1 多级存储模型54 微服务篇…