C语言阶段二(linux)day6 一、动态内存的分配和回收 由于栈区的内存空间都是由操作系统负责分配和回收的, 使用的过程中,不够灵活,空间的大小,和生命周期都不够灵活。 所以有些场景下,需要我们灵活操作内存的时候,就需要自己手动分配和回收了。 自己手动分配的内存是在堆区的。 1.1 分配–malloc 函数说明 1.2 回收–free 堆区自己分配的空间,不会主动被操作系统回收,而是需要我们自己在不再需要使用的时候 手动的调用 free 函数来进行回收,所谓的回收,是回收使用权, 相当于告诉操作系统,这块空间我不再使用了,你可以把他分给别人了 如果自己的程序中只分配空间,而不释放,会造成内存泄漏的问题 内存泄漏就是指:只分配不回收,导致的系统内存资源越来越少的问题 内存泄漏只发生在长时间运行的服务器程序上, 因为进程结束时,操作系统会回收进程的所有资源 内存泄漏一旦出现就很难解决,所以要养成良好的代码习惯,分配时就想好何时回收。 函数说明 例 练习: 封装一个函数 hqyj_malloc,函数的功能是:在堆区分配一个长度5的int类型的数组空间 且将数组素赋值成 10 20 30 40 50 main函数中可以通过调用hqyj_malloc来分配的首地址,且遍历输出数组素 二、分文件编程 在实际大型项目开发的过程中,并不会将所有的代码都写在一个 .c 文件中 而是会根据功能模块不同 拆分成多个 .c 和 .h 其中 .c 文件中存放函数的定义 .h 文件中存放函数的声明 main函数中只负责函数的调用
编译的时候 gcc 后面需要写所有的.c文件名 注意:不要写.h VScode连接不上Ubuntu的排查方式 1.确认Ubuntu的网络状态 Ubuntu中 ifconfig ip 是不是 192.168.250.100 2.如果不是,重启网络服务: sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo vi /etc/NetworkManager/NetworkManager.conf 将里面的 managed=false 改成 managed=true 保存退出 sudo service network-manager start ifconfig 查看ip地址 如果不是 192.168.250.100 则 执行 sudo netplan apply 然后再确定 是不是 192.168.250.100 ping http://www.baidu.com 看一下有没有网 3.上面操作做完后 如果vscode还是连不上Ubuntu 先在 window 按 win+r 输入cmd ssh linux@192.168.250.100 如果没问题 ls 能看到 自己 Ubuntu家目录下的内容 4.重启一下vscode 三、typedef tyepdef的功能:给类型起别名 如: typedef int hqyj; //给int起个别名叫 hqyj //后面使用int定义变量和使用 hqyj定义变量是一样的 int a = 10; hqyj b = 10; 为什么要给类型起别名? 1.有些类型名字比较长,写起来不方便,如 unsigned long long int 这种情况就可以使用typedef起个别名 typedef unsigned long long int hqyj; 后面使用hqyj定义变量和使用 unsigned long long int定义变量是一样的 2.我们后面会学到枚举、结构体、共用体,这些类型名字都有两个单词组成 配合着typedef使用起来会更方便。 关于C语言中的类型名 定义变量的语句 把定义变量的语句中的变量名去掉,剩下的就是类型名: 在定义变量的语句前加上typedef 原来的变量名 就变成了新的类型名: 如:signal函数的使用 笔试面试题: typedef和宏定义有什么区别? 1.typedef必须加分号 define不强制要求 2.宏定义只是一个简单的无脑替换,而typedef是给类型起别名 四、枚举–enum 4.1 概念 枚举是一个基本类型,枚举就是数据的有限罗列。 枚举是用来防止“魔鬼数字”的 4.2 定义枚举的格式 注意事项: 1. enum和枚举类型名 共同构成一个类型,定义变量时: enum 枚举类型名 变量名; 2. 枚举的成员之间用 逗号 分隔 3. 如果枚举的成员1没有被赋值,默认值是0 4. 枚举的成员的值是依次递增的,每次递增1 5. 如果某个成员被赋了初始值,那么后面的成员在该值的基础上依次递增1 6. 枚举类型的大小,取决于枚举中最大素的值,一般情况下都是4字节的 7. 枚举的成员一旦定义好之后 就都是常量 8. 当局部变量的名字和枚举成员的名字冲突时,采用局部优先原则 例: 4.3 定义枚举变量的格式 4.4 枚举和typedef结合 五、结构体–struct 5.1 概念 结构体是一个构造类型, 结构体里面既可以是相同的数据类型的集合 也可以是不同的数据类型的集合 一般情况下,结构体多用于管理一组不同数据类型的数据 5.2 定义结构体的格式 注意: 1.结构体的使用方式和枚举类似,又略有不同 2.结构体成员之间用 分号 分隔 3.结构体的成员都是变量 4.结构体的成员在内存上都是连续的(涉及到内存对齐的问题) 5.结构体变量之间可以直接相互赋值 5.3 定义结构体变量 变量: struct 结构体类型名 结构体变量名; 指针: struct 结构体类型名 *结构体指针名; 5.4 结构体访问成员 列 结构体数组的定义方式: struct 结构体类型名 数组名[下标]; 给内存空间清0 memset(首地址,0, 长度); 5.5 练习:使用结构体实现学生管理系统 https://zhuanlan.zhihu.com/p/a.out —————————————————————- | 1.添加 2.查找 3.修改 4.删除 | | 5.学员信息排序 6.输出所有学员信息 7.退出 | —————————————————————- 请输入你的选择: 代码实现: student.h student.c main.c 完成学生管理系统的 查找 修改 删除 排序 的功能
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/60359.html