苏嵌嵌入式linux C实训 第5天

项目开发日报表:

项目名称 苏嵌实训-嵌入式Linux 第5天
今日进度及任务 函数、内存管理、关键字、符合数据类型
任务完成情况 课堂内容总结完成
开发中出现的问题汇总
未解决问题
本日开发收获 对函数、内存管理、关键字和复合数据类型学习更加深入
其他

作业

1.C语言free函数是如何知道要释放内存空间的?

     调用malloc开辟空间的同时,malloc会返回一个指针p,在指针p的后面(地址高于指针p的方向)为新开辟的空间,而在指针p的前边(地址低于指针p的方向)12个字节处,会有4个字节记录开辟空间的大小。当free的时候就去找那个数值,释放掉数值大小的堆空间。

2.static在什么样的情况下使用?修饰局部变量:

  • 修饰局部变量:
         当需要改变局部变量的生命周期,即只赋值一次,直到程序结束才释放的时候用static修饰 该局部变量。
         在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
         内存中的位置:静态存储区
         初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被 显示初始化)
         作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

  • 修饰全局变量
         只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。即当该全局变量只需初始化一次,不许其他源文件访问的时候用static修饰全局变量。
         在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
         内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
         初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
         作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

  • 修饰函数
         当需要函数只能在声明它的文件中可见,其他文件不能引用的时候可用static修饰该函数。
    在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

         注意: 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

3.为什么要使用tepdef给类型重命名

     就是为了让在不同使用环境下让数据类型变得有“具体含义”。linux内核中,很多很复杂的“结构”,例如内存结构描述符,进程结构描述符,但它们也会有类似上面那种情况,需要用在不同的背景下;因此,经常使用typedef重命名。
     

课堂内容总结

     

函数

  • 函数三要素:函数名、形参、返回值

1、函数名:
  命名–>自注释性 动词 + 名词 例子:add_user del_user删除用户
2、函数参数:
  实参是什么类型,形参就要定义为什么类型;

  • 传数组名
      传一维数组名,用元素的指针;
      传二维数组名,用一维数组指针;
      传三维数组名,用二维数组指针
      传指针数组名,用指针的指针;

3、函数的返回值:
   return :正常退出;
  exit:异常退出

  • 函数指针变量: 保存函数的入口地址;
  • 函数名作用: 指针常量,保存函数的入口地址:(函数地址)
  • 函数指针的作用: 做函数形参,实现回调函数
  • 华为的编码规范
      入口参数检查
      函数的异常处理
       

内存管理

  • 内存是稀缺资源

1. 数据存放在哪?
苏嵌嵌入式linux C实训 第5天_第1张图片

  • 栈空间是系统管理的

  • 堆空间是用户管理的

2. 常见内存错误

  • 内存泄露(大错误)、内存碎片、内存空洞

3. malloc/free

  • 开销非常大

4.内存池

  • 思路:将使用多次malloc操作改变成只使用一次 malloc/free是一个开销非常大的操作;
  • 池化技术:解决开销大的问题

   

关键字:

  • register
    作用:尽可能将数据保存到CPU的寄存器中;提高程序执行效率(省去了CPU 从内存抓取数据的时间)

  • static
    修饰局部变量 作用:改变值后还存在 延长局部变量的生命周期,全部程序结束后才释放。局部变量只执行一次。

  • extern
    外部声明 告诉编译器这个函数或者变量是在其他文件定义的

  • const
    修饰变量,该变量成为一个只读变量(值是可以改变的)

    在C语言里修饰变量名的权限,告诉编译器不能通过该变量变量名去改变改变量的内存空间,但可以通过指针修改。

    注意:修饰某个变量时一定要初始化。离谁近修饰谁,谁就不能做修改

  • typedef
    给类型重命名t ypedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名。typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
       

复合数据类型

struct结构体

struct node
{
	int num;
	char ch;
};

typedf struct node Node;//给结构体重命名

int main()
{
	struct node p;
	//struct node p = {.num = 1,.ch = 'a'};//另一种初始化写法
	struct node *pp = &p;
	p.num = 1;
	p.ch = 'a';
	
	pp -> num = 2;
	pp -> ch = 'b';
}

union共用体
    所有成员占用同一段内存,修改一个成员会影响其余所有成员。

enum枚举
    当项目中需要多个整数宏时,就就要使用枚举。

你可能感兴趣的:(物联网工程实训,指针,编程语言,linux)