您的位置:首页 > 运维架构 > Linux

【苏嵌实训-嵌入式 linux C 第 5 天】

2020-07-14 06:33 148 查看
项目名称 【苏嵌实训-嵌入式 linux C 第 5 天】
今日进度以及任务 嵌入式C实战详解1-函数、内存管理、关键字、符合数据类型
本日任务完成情况 作业及笔记见表格下方。
本日开发中出现的问题汇总
本日未解决问题
本日开发收获 学习了C语言的函数、内存管理、关键字和复合数据类型相关知识,还锻炼了几个算法题。
其他

作业:

1、malloc、free、内存池

(1)malloc实现原理?
   首先挨个检查堆中的内存是否可用,如果可用那么大小是否能满足需求,要是都满足的话就直接用。当遍历了堆中的所有内存块时,要是没有能满足需求的块时就只能通过系统调用向操作系统申请新的内存,然后将新的内存添加到堆中。

(2)free如何知道释放多大的内存空间?
  操作系统在分配内存的时候 同时会划分一个区域用于存储分空间的首地址和内存分配大小,当用户调用free函数的时候是 改变这个区域里存储的内存大小的值,具体内存空间的释放由操作系统去完成。

(3)内存池实现原理?
  内存池的思想是,在真正使用内存之前,预先申请分配一定数量、大小预设的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存,当内存释放后就回归到内存块留作后续的复用,使得内存使用效率得到提升,一般也不会产生不可控制的内存碎片。

2、static在什么样的情况下使用?

修饰局部变量:
  当需要改变局部变量的生命周期,即只赋值一次,直到程序结束才释放的时候用static修饰 该局部变量。
修饰全局变量:
  只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。即当该全局变量只需初始化一次,不许其他源文件访问的时候用static修饰全局变量。
修饰函数:
  当需要函数只能在声明它的文件中可见,其他文件不能引用的时候可用static修饰该函数。

3、为什么要使用typedef给类型重命名?

  好处是能区分不同场合使用不同数据类型,让在不同使用环境下让数据类型变得有“具体含义”。

笔记:

一、函数

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

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

传地址和传值:什么时候传地址,什么时候传值?
 (1)当只使用不修改实参变量的值,传实参变量名;func(实参变量名)。
 (2)当使用即修改实参变量的值,传实参变量的地址;func(&实参变量名)。
3、函数的返回值:
  return :正常退出;
  exit:异常退出

4、华为的编码规范
  <入口参数检查、函数的异常处理 >

5、
函数指针变量: 保存函数的入口地址;
函数名作用: 指针常量,保存函数的入口地址:(函数地址)
函数指针的作用: 做函数形参,实现回调函数
 
 

二、内存管理

C语言内存管理<内存是稀缺资源>
 
1、对程序员来讲,内存管理应该掌握哪些内容?
数据存放在哪?<Linux虚拟地址空间分布图>
高地址:1G给内核;
低地址:3G给用户,3G分为栈空间、堆空间、数据段、代码段
栈空间是系统管理的
堆空间是用户管理的

2、常见的内存错误:
  内存泄露(大错误)、内存碎片、内存空洞

3、malloc / free
  malloc / free是一个开销非常大的操作

4、内存池:
  (将使用多次malloc操作改变成只使用一次)

三、关键字

1、register:

作用:
  尽可能的将数据保存到CPU的寄存器中,提高程序执行效率;(省去了CPU通过总线从内存抓取数据的时间)
注意事项:
 (1)不能修饰全局变量、不能修饰函数
 (2)修饰变量的类型必须是CPU所接受的
 (3)变量可能不是在内存中存储,所以不能跟使用&来获取变量的地址。

2、static:

static修饰局部变量:
  延长了局部变量的生命周期,程序结束之后再释放,(只执行一次)。
static修饰全局变量:
  静态全局变量,该变量不能在其他文件中访问。
static修饰函数:
  该函数只能被本文件的函数调用,不能被其他文件访问。

3、extern :

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

4、const:

(1)修饰变量,该变量成为一个只读变量 (值是可以被改变的)
(2)告诉编译器不能通过num变量名去修改num对应的内存空间
(3)使用注意事项:修饰某个变量时,一定要初始化;

5、typedef:

给数据类型重命名

四、复合数据类型

1、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';
}

 

2、union:

定义代码如下:

union node2
{
int num;
char ch;
};

 

3、enum:

定下代码如下:

enum result
{
A = 1,
B = 5,
C
};
//以上等价于---->
//#define A 1
//#define B 5
//#define C 6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: