作业
作业1:free(void *ptr)如何知道释放多少空间?
调用malloc开辟空间的同时,malloc会返回一个指针p,在指针p的后面(地址高于指针p的方向)为新开辟的空间,而在指针p的前边(地址低于指针p的方向)12个字节处,会有4个字节记录开辟空间的大小。当free的时候就去找那个数值,释放掉数值大小的堆空间。
作业2 :static在什么情况下使用?
何时定义静态变量:
1.当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。
2.当一个变量的本次操作结果值需要作为下一次操作的初始值时。
何时定义静态函数: 当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
作业3 :为什么要使用typedef给类型重命名?
就是为了让在不同使用环境下让数据类型变得有“具体含义”。linux内核中,很多很复杂的“结构”,例如内存结构描述符,进程结构描述符,但它们也会有类似上面那种情况,需要用在不同的背景下;因此,经常使用typedef重命名。
课堂笔记
- 函数三要素:函数名,形参,返回值
- 函数名:命名 要具有自注释性 如: 动词+名词 add_user
- 函数的参数:实参是什么类型,形参就要定义成什么类型;
<传数组名>:传一位数组名,用元素指针。二维用一维数组指针。三维,用二维数组指针。传指针数组名,用指针的指针。传地址和传值:传变量名不改变原参数值,传地址可以修改。 - 函数编码规范
检查函数所有参数输入的有效性。
对所调用函数的错误返回码要仔细、全面地处理。
- 内存管理
内存是稀缺资源。
- 数据存放位置是 Linux的虚拟地址空间
- 栈空间:存放局部变量,函数形参
- 堆:malloc/free(开销很大) ralloc calloc 是系统管理的
- 常见的内存错误:内存泄漏,内存碎片,内存空洞
- 内存池:将使用多次malloc操作改成只使用一次
-
关键字
-
register 寄存器变量 作用:尽可能的将数据保存到CPU的寄存器中,提高程序执行效率:省去了从内存抓取数据的时间。不能修饰全局变量和函数,只能修饰局部变量 修饰常量后不能取地址,因为取地址是去内存,register是在寄存器。什么时候用:频繁使用某变量时。
-
static 修饰局部变量 作用:改变值后还存在 延长局部变量的生命周期,全部程序结束后才释放。局部变量只执行一次。
修饰全局变量或函数(静态全局变量) 那么别的文件就不能访问 -
extern 外部声明 告诉编译器这个函数或者变量是在其他文件定义的
-
const 修饰一个变量,该变量成为一个只读变量(修饰的是变量名的权限,告诉编译器不能用变量名修改他的内存空间:可通过指针)。值可以被改变,用指针。 距离谁近就修饰谁,谁就不能被修改。 修饰形参可以保护实参。
-
typedef 给类型重命名t ypedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名。typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
-
复合数据类型
-
结构体struct 定义和使用方法 sizeof是4个4个的分配,不够四个按照4个
-
枚举enum 从第一个开始表示的值累加。当项目中需要多个整数宏时使用。
-
共用体union 共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
项目开发日报表
项目名称 | 【苏嵌实训-嵌入式 linux C 第 5天】 |
---|---|
今日进度 以及任务 | C语言 函数,内存,关键字,复合数据类型 |
本日任务完成情况 | 掌握了内存管理、分配以及一些关键字和复合数据类型的定义和使用方法 |
本日开发中出现的问题汇总 | 编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,思路是要将整个句子逆序后,再将每个单词逆序 |
本日未解决问题 | |
本日开发收获 | 代码越来越规范化,对数组和函数的使用方法更加熟练 |
其他 |