C程序设计C程序设计 (41).pdf

上传人:刘静 文档编号:52830423 上传时间:2022-10-23 格式:PDF 页数:29 大小:1.93MB
返回 下载 相关 举报
C程序设计C程序设计 (41).pdf_第1页
第1页 / 共29页
C程序设计C程序设计 (41).pdf_第2页
第2页 / 共29页
点击查看更多>>
资源描述

《C程序设计C程序设计 (41).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (41).pdf(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C C程序设计程序设计Programming in CProgramming in C设计函数函数间的数据传递(设计函数函数间的数据传递(2 2)1、程序映像2、程序加载C C程序设计程序设计程序设计程序设计3 34.6.4 4.6.4 程序映像和内存布局程序映像和内存布局1程序映像C源程序经过编译、连接后,成为二进制形式的可执行文件,称为程序映像。可执行文件采用ELF格式(可执行连接格式)存储。4 44.6.4 4.6.4 程序映像和内存布局程序映像和内存布局可执行连接格式(ELF,Executable and Linkable Format)。5 54.6.4 4.6.4 程序映像和内存布

2、局程序映像和内存布局Helloworld程序映像#include int#include int mainmain()()printfprintf(hello,world(hello,worldnn););returnreturn 0 0;6 64.6.4 4.6.4 程序映像和内存布局程序映像和内存布局可执行连接格式ELF内容包含程序指令、已初始化的静态数据和其他一些重要信息,例如未初始化的静态数据空间大小、符号表(symbol table),调试信息(debugging information)、动态共享库的链接表(linkage tables for dynamic shared lib

3、raries)等。7 74.6.4 4.6.4 程序映像和内存布局程序映像和内存布局图4.9 可执行文件映像与内存映像8 84.6.4 4.6.4 程序映像和内存布局程序映像和内存布局2程序加载运行程序时,由操作系统将可执行文件载入到计算机内存中,成为一个进程(process)。程序在内存中的布局由5个段(segment)组成。9 94.6.4 4.6.4 程序映像和内存布局程序映像和内存布局1代码段代码段(text segment)存放程序执行的机器指令(machine instructions)。通常情况下,text段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份

4、副本即可。text段通常也是只读的,使其只读的原因是防止一个程序意外地修改了它的指令。10104.6.4 4.6.4 程序映像和内存布局程序映像和内存布局C程序的表达式、语句、函数等编译成机器指令就存放于text段。程序运行时由操作系统从程序映像中取出text段,布局在程序内存地址最低的区域,然后跳转到text段的main函数开始运行程序,程序结束后由操作系统收回这段内存区域。11114.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#include int#include#include int K K=1010;/存放data段/存放data段floatfloat

5、 f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;/存放stack段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内存映像12124.6.4 4.6.4 程序映像和内存布局程序映像和内存布局2已初始化数据段已初始化数据段(data segment

6、)用来存放C程序中所有已赋初值的全局和静态变量、对象,也包括字符串、数组等常量,但基本类型的常量不包含其中,因为这些常量被编译成指令的一部分存放于text段。13134.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#include int#include#include int K K=1010;/存放data段/存放data段floatfloat f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;/存放stac

7、k段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内存映像14144.6.4 4.6.4 程序映像和内存布局程序映像和内存布局程序运行时由操作系统从程序映像中取出data段,布局在程序内存地址较低的区域。程序结束后由操作系统收回这段内存区域,即释放data段。显然,data段的存储单元有与程序代码相同的生命期,它们的初始值实际在编译时就已经确定了。即使程序没有运行,这些存储单元的初始值也固定下来了,当

8、程序开始运行时,这些存储单元是没有初始化的动作。在程序运行中,data段的存储单元数据会一直保持到改变为止,或保持到程序结束为止。15154.6.4 4.6.4 程序映像和内存布局程序映像和内存布局3未初始化数据段未初始化数据段(bss segment)用来存放C程序中所有未赋初值的全局和静态变量。在程序映像中没有存储bss段,只有它的空间大小信息;程序运行前由操作系统根据这个大小信息分配bss段,且数据值全都初始化为0,布局在与data段相邻的区域。程序结束后由操作系统收回这段内存区域,即释放bss段。16164.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#in

9、clude int#include#include int K K=1010;/存放data段/存放data段floatfloat f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;/存放stack段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内

10、存映像17174.6.4 4.6.4 程序映像和内存布局程序映像和内存布局显然,bss段的存储单元也有与程序代码相同的生命期,但与data段不同的是如果程序没有运行,bss段的存储空间是不存在的,因而也就不会有初始值。在程序运行前,这些存储单元会初始化为0。此后,bss段的存储单元的性质与data段完全相同。18184.6.4 4.6.4 程序映像和内存布局程序映像和内存布局data段和bss段的存储特点,决定了C程序中所有全局和静态变量、对象的存储空间在main函数运行前就已经存在,就有了初始值。程序运行到这些变量和对象的定义处时,是不会再有初始化动作的。在程序运行中这些变量和对象的存储空间

11、不会被释放,一直保持到程序运行结束。期间如果数据被修改,则修改会一直保持。19194.6.4 4.6.4 程序映像和内存布局程序映像和内存布局4栈栈(stack)用来存放C程序中所有局部的非静态型变量、临时变量,包含函数形参和函数返回值。程序映像中没有栈,在程序开始运行时也不会分配栈。每当一个函数被调用,程序在栈段中按函数栈框架入栈,就分配了局部变量存储空间。如果这些变量有初始化,就会有赋值指令给这些变量送初值,否则变量的值就呈现随机性。当函数调用结束时,函数栈框架出栈,函数局部变量释放存储空间。20204.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#includ

12、e int#include#include int K K=1010;/存放data段/存放data段floatfloat f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;/存放stack段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内存映像2

13、1214.6.4 4.6.4 程序映像和内存布局程序映像和内存布局栈的存储特点,决定了C程序中所有局部的非静态型变量,其存储方式是动态的。函数调用开始时得到分配,赋予初值,函数调用结束时释放空间,变量不存在。下次函数调用时再重复。22224.6.4 4.6.4 程序映像和内存布局程序映像和内存布局5堆堆(heap)用来存放C程序中动态分配的存储空间。程序映像中没有堆,在程序开始运行时不会分配堆,函数调用时也不会分配堆。堆的存储空间分配和释放是通过指定的程序方式来进行的,即由程序员使用指令分配和释放,若程序员不释放,程序结束可能由操作系统回收。23234.6.4 4.6.4 程序映像和内存布局程

14、序映像和内存布局C语言中可以通过使用指针、动态内存分配和释放函数来实现堆的分配和释放。程序可以通过动态内存分配和释放来使用堆区,堆区有比栈更大的存储空间、更自由的使用方式。24244.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#include int#include#include int K K=1010;/存放data段/存放data段floatfloat f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;

15、/存放stack段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内存映像25254.6.4 4.6.4 程序映像和内存布局程序映像和内存布局堆和栈的共同点是动态存储,处于这两个区域的存储单元可以随时分配和释放,所以这些存储单元的使用特点呈现临时性的特点。data段的特点是静态存储,处于这个区域的存储单元随程序运行而存在,随程序结束才释放,相对程序生命期,data段存储单元的使用特点呈现持久性的特点。d

16、ata段由于持久占有存储空间,因此大小会被操作系统限定,而堆可以达到空闲空间的最大值。26264.6.4 4.6.4 程序映像和内存布局程序映像和内存布局堆和栈的区别是分配方式的不同,栈是编译器根据程序代码自动确定大小,到函数调用时有指令自动完成分配和释放的;堆则完全由程序员指定分配大小、何时分配、何时释放。堆的优点是分配和释放是自由的,缺点是需要程序员自行掌握分配和释放时机,特别是释放时机,假如已经释放了还要使用堆会产生引用错误,或者始终没有释放产生内存泄漏(memory leak)。27274.6.4 4.6.4 程序映像和内存布局程序映像和内存布局#include#include int

17、#include#include int K K=1010;/存放data段/存放data段floatfloat f f;/存放bss段/存放bss段intint mainmain()()static intstatic int i i=5 5;/存放data段/存放data段doubledouble d d=5 5;/存放stack段/存放stack段charchar*p p;p p=mallocmalloc(1 1););/存放heap段/./存放heap段/.freefree(p p););/释放heap段/释放heap段returnreturn 0 0;程序加载后的内存映像28284.

18、6.4 4.6.4 程序映像和内存布局程序映像和内存布局例4.231/程序内存布局举例/程序内存布局举例2#include#include 3 intint a a=0 0;/a存储在已初始化数据区data/a存储在已初始化数据区data 4 charchar*p1p1;/p1存储在bss区(未初始化全局变量)/p1存储在bss区(未初始化全局变量)5 intint mainmain()()6 intint b b;/b存储在stack/b存储在stack7 charchar s s=abc;=abc;/s为数组变量,存储在stack/s为数组变量,存储在stack8/abc为字符串常量,存储

19、在data/abc为字符串常量,存储在data9 charchar*p1p1,*,*p2p2,*,*p3p3=123456;=123456;/p1-p3在栈区 1234560在data/p1-p3在栈区 1234560在data10 static intstatic int c c=0 0;/c为全局(静态)数据,存储在data/c为全局(静态)数据,存储在data11/静态数据会自动初始化/静态数据会自动初始化12 p1p1=(=(charchar*)*)mallocmalloc(1010););/分配得来的10个字节的区域在heap/分配得来的10个字节的区域在heap13 p2p2=(=(charchar*)*)mallocmalloc(2020););/分配得来的20个字节的区域在heap/分配得来的20个字节的区域在heap14 freefree(p1p1););freefree(p2p2););15 returnreturn 0 0;结束结束

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁