嵌入式C编程 02_存储类型和内存管理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

存储类型和内存管理课程安排程序内存映像变量存储类型函数作用域动态内存分配程序映像布局1、静态映像(可执行文件):TEXT段、DATA段、BSS段;2、动态映像(可执行文件运行):BSS段消失增加堆和栈1、TEXT:保存指令代码、立即数等只读信息,函数地址就在该段中分配2、DATA:保存已初始化全局变量、静态变量。其中又分为RODATA,保存字符串常量等只读数据3、BSS:记录未初始化全局变量、静态变量的标号的内存大小,程序运行后为这里数据在DATA段分配内存并初始化为04、堆:保存临时动态分配内存5、栈:保存临时静态分配内存内存映像定义1、2、3、4、变量影响程序映像大小课程安排程序内存映像变量存储类型函数作用域动态内存分配变量内存分配方式1、静态分配:在程序执行时由系统自动分配,使用完毕后由系统自动回收根据类型大小自动在数据段、栈分配静态内存好处是不存在内存泄露问题,但静态分配的内存有限2、动态分配:需要在代码中手动分配,使用完毕后必须在代码中手动回收根据运行时的要求在堆上分配动态内存好处是能动态分配很大的内存,但一旦忘记回收,内存泄露严重影响系统性能静态分配变量最常用的变量使用方式是静态分配变量要使用静态分配的变量必须评估变量两方面属性:1、变量生存期:生存期就是变量的存储空间从建立到被收回的一段时期。生存期内才为变量分配内存!2、变量作用域变量的作用域也称为可见性,是指变量能访问到的范围。在有效作用域内,变量必须是唯一的!变量生存期1、临时生存期:在栈上分配内存在函数执行时为变量分配内存,函数执行结束回收内存生存期是从进入函数起,到退出函数时结束2、永久生存期:在数据段分配内存在程序开始执行时为变量分配内存,程序结束回收内存生存期是从进入程序起,到退出程序时结束变量作用域1、函数(程序块)内:定义在函数(程序块)之内,只能在该函数(程序块)中使用2、模块(文件)内:定义在函数之外,能被该文件内的所有函数使用(使用之前变量必须先定义)3、模块(文件)间:定义在函数之外,可以被整个程序所有文件的所有函使用(使用之前变量必须先定义)1、局部变量:auto关键字修饰(可省略),定义在函数之内栈上分配,临时生存期,作用在函数内2、全局变量:慎用带extern关键字修饰(可省略),定义在函数外数据段分配,永久生存期,作用在模块间其他模块的函数引用时习惯带extern关键字声明3、静态局部变量:带static关键字修饰,定义在函数之内数据段分配,永久生存期,作用在函数内4、静态全局变量:用static关键字修饰,定义在函数之外数据段分配,永久生存期,作用在模块内变量存储类型局部静态变量使用示例全部静态变量使用示例全部变量使用示例变量只能被定义一次,但可以被多次声明引用1、auto:声明或定义自动变量,该关键字可省略2、extern:声明或定义外部存储变量定义时关键字可省略3、static:声明或定义静态变量4、register:声明或定义寄存器变量(已经很少使用)告诉编译器,尽量把变量定义为寄存器变量,当CPU无多余寄存器可用时,编译器自动将其作为自动变量处理存储类型说明符课程安排程序内存映像变量存储类型函数作用域动态内存分配在TEXT段(代码段)为函数体分配内存函数名代表函数体的首地址函数的生存期都贯穿整个程序执行期函数生存期1、模块内(静态函数):非接口函数只能被函数定义模块(文件)的函数调用通常函数声明和定义都在源文件内定义和声明函数时可用static关键字修饰,表示函数只在当前模块使用(也可省略)带static关键字修饰的函数不要在头文件声明!2、模块间(全局函数):接口函数能所有模块(文件)的函数调用通常将函数声明在头文件,供其他模块引用定义和声明函数时用extern关键字修饰(可省略)函数作用域函数作用域声明示例static修饰的静态函数为内部函数,main.c中无法使用只有全局函数才能作为接口函数在头文件声明课程安排程序内存映像变量存储类型函数作用域动态内存分配在数据段或者栈上分配内存属于静态分配方式好处:1、简单易用,内存分配和回收由系统自动完成特点:1、编译时必须明确变量所需要的内存空间2、所需的内存空间过大,可能到时内存分配失败!静态内存分配C程序结构栈上分配过大系统为运行程序使用的栈容量很有限!如果需要的内存空间,要到程序运行时才能根据实际情况确定或者需要分配一个大内存池--这时可以用动态内存分配动态内存在堆上分配,特点是需要手工分配,并且手工回收!动态内存分配动态内存申请与释放动态分配得到的内存通过指针引用!动态内存申请(malloc)与释放(free)必须配对!内存泄露动态内存申请malloc后不释放free,系统不会自动回收动态内存就算程序退出后动态内存也一直被占用,造成内存泄露影响整个系统—系统性能降低动态内存函数calloc:用于申请并初始化动态内存数组realloc:用于重新调整已分配的动态内存大小上机实验1、有一组信息charmsg[]={“数据交互”};在函数内定义,怎么交互给其他函数使用?在函数外定义,怎么在本模块交互使用?在函数外定义,怎么在模块间交互使用?2、根据学生个数为学生信息表申请动态内存

1 / 27
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功