嵌入式软件开发培训笔记——C高级 存储类、链接和内存管理

1)概念:分配和释放内存的方式。

2)管理方法:

1)静态内存管理方式

    在程序中定义变量,在编译阶段为其分配内存空间,该内存空间的生命周期在程序运行过程中由系统帮助我们维护,不需要我们在代码里显式地释放。

2)动态内存管理方式

程序在运行过程中由代码负责来动态地管理内存,C语言中通过malloc()free()库函数来显式地申请和释放。

3)静态内存管理

变量变量定义:一个变量唯一对应着一个独立的内存空间。在C程序中我们给这块内存空间起了一个名字,称之为变量名,我们可以用该变量名来标识并引用该内存空间。


ELF -> Executable Linkable Format

section header table节头表(用于记录有哪些节、节大小、节排放顺序)

.text 正文节:存放程序编译完后所有的机器指令

.data数据节:全局变量

.rodate只读数据节:全局常量

program header table程序(可执行程序)头表(用于说明哪些节要被加载到内存里去)

这些信息可以用readelf -a filename查看

3)定义变量的语法

<类型限定词><存储类别><数据类型><变量表>;

相关C语言的关键字

类型限定词:constvolatilerestrict

存储类别:autoregisterstaticextern

数据类型:intfloatcharstruct,指针等等

变量表:以逗号","分隔

4)存储模型

    或称为存储类。决定了一个变量的内存分配方式和访问特性。在C里主要由三个维度来决定:

1)存储时期storage duration

    变量在内存中的保留时间(生命周期)。存储时期分为两种情况,关键是看变量在程序执行过程中会不会被系统自动回收掉。

    a、静态存储时期(static storage duration):在程序执行过程中一旦分配就不会被自动回收。

        通常来说,任何不在函数代码块内定义的变量。

        无论是否在代码块内,只要采用static关键字修饰的变量。

    b、自动存储时期(automatic storage duration):除了静态存储时期以外的变量都是自动存储时期的,或者说只要是在代码块内定义的非static的变量。系统会对其自动分配和释放内存。

2)作用域scope

    一个变量在定义该变量的自身文件中的可见性(访问或者引用)。

C语言中,3种作用域

    a、代码块作用域(block scope):在代码块中定义的变量都具有代码块作用域。从这个变量定义地方开始,到这个代码块结束,该变量均是可见的。

    b、函数原形作用域(function prototype scope):出现在函数原型中的变量,都具有函数原型作用域,函数原型作用域从变量定义处一直到函数原型申明的末尾。(函数原型指函数声明语句)

    c、文件作用域(file scope):一个在所有函数之外定义的变量具有文件作用域,具有文件作用域的变量从它的定义处到包含该定义的文件结尾处都是可见的。

3)链接linkage

    一个变量在组成程序的所有文件中的可见性(访问或者引用)。

   C语言中,3种不同的作用域

    a、外部链接(External Linkage:如果一个变量在组成一个程序的所有文件中的任何位置都可以被访问,则称该变量支持外部链接。变量用extern修饰。

    b、内部链接(Internal Linkage:如果一个变量只可以在定义其自身的文件中的任何位置被访问,则称该变量支持内部链接。变量用static修饰。

    c、空链接(No Linkage:如果一个变量只是被定义其自身的当前代码块所私有,不能被程序的其他部分所访问,则称该变量支持空链接。

补充:register int s;指尽可能定为寄存器变量,但是注意;这种变量定义后,不可对其取地址


int func()

{

        static int i;                      //bss section------>bss segment  并初始化为0

        static int i = 1;               //data section----->datasegment          //RW

        const static int i = 1;    //rodata section----->rodatasegment    //RO

}

5)动态内存管理

1)申请/分配内存——void *malloc(size_t size);

补充:检查是否为空


补充:检查具体内存中的数据


2)释放内存——void free(void *ptr);

执行free操作后,表明上被释放但之前由malloc申请的那块地址中的数值还在,因此需在free语句后加上“p = NULL;”语句

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值