网站大量收购闲置独家精品文档,联系QQ:2885784924

3内存分区与函数调用.ppt

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3内存分区与函数调用

* 代码区(代码段,函数区) 顾名思义:用于存放代码,这里特指函数的代码。 存放了唯一一份函数定义的二进制代码。 有全局的地址:函数名称。 * 栈区 函数调用时临时开辟的内存空间。 由系统自动分配,自动回收。 类似数据结构中的栈。 * 带参数的函数 void fun(int a, int b) { int c = a * b; printf(c=%d\n,c); } int main() { int a = 0; fun(2, 4); return 0; } * 函数调用(示意图) main a 0 4 fun c a b 2 8 printf system * 函数调用 调用 开辟栈空间。 值拷贝:形式参数(形参)拷贝实参的值。 返回 函数在遇到return语句,或函数体结束时返回。 有返回值的函数,函数调用结束后,会把返回值放在某个地方(寄存器),由函数的调用方读取。 先声明再使用 无论是函数,还是变量,都遵循先声明(定义)再使用 函数中声明的局部变量,要放在函数体的前部 全局变量(函数之外)放在它被使用之前。 * * * 参数传递 传变量 void f(int a) 传地址(传指针) void f(int * p) 传引用(C++) void f(int p) 传数组(一维) void f(int a[],int n) 传递数组 一维数组传递参数:f(int a[],int n) 指向数组元素首地址的指针p,元素个数n p用来偏移地址,迭代地指向每个元素 n用来限定偏移的范围,以防止非法访问 二维数组的两种传递参数的办法 * int b[2][3] void g(int (*b)[3], int n) void g(int b[][3], int n) void g(int *b, int m, int n) * 堆区 程序员自己分配,自己回收。 程序结束时,操作系统会回收其所占用的进程空间。 堆的生长方向是向上的,向着内存地址增加的方向;栈生长方向是向下的向着内存地址减小的方向 在堆上可以声明动态数组。 int *p = malloc(sizeof(int)); printf(*p = %p\n,*p); free(p); p = NULL; * 静态区 存储全局变量和静态变量。 静态限定作用域 全局变量可以是静态的,静态变量不一定是全局的。 全局变量在main函数之前就已经存在。 程序结束后,由操作系统统一回收。 * 文字常量区(只读数据段) 存放字符串,程序结束后由操作系统释放。 函数可以返回字符常量的地址,也可以返回堆区的地址,但不能返回局部变量的地址。 进程内存布局示意图 * * 静态区(全局+static) 文字区(字符串) 代码区(函数) 堆(malloc,free) 栈(调用函数) Windows Kernel Share Space * 习题 求一个整型数组的所有元素之和 对一个整型数组的元素序列进行反转。即对调a[i]与a[n-1-i] 设计一个连接两个字符串的函数,例如 s1 = china; s2 = people; 连接后变成chinapeople; * 思考 传指针的优缺点 在同一个函数体内被调用的两个函数,它们的地址空间可能重叠吗? 你能确定下面的组合定义吗?如:int (*p)(); int *p();

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档