码迷,mamicode.com
首页 > 其他好文 > 详细

函数调用模型

时间:2019-01-05 21:30:43      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:开始   pst   ima   应用程序   建立   font   参数   函数调用   局部变量   

一 函数调用模型

入栈的过程

程序开始运行时,操作系统会找到程序的入口函数main。操作系统会把main函数的返回地址入栈,然后把main函数的参数入栈,如果main中有局部变量,还会把这些变量入栈。

main函数中调用fa函数时,操作系统把main函数的运行状态入栈,把fa的返回地址入栈,把fa的参数入栈。

fa函数调用fb函数时,操作系统把fa函数的运行状态入栈,把fb函数的返回地址入栈,把fb的参数入栈。

入栈的过程如图:

技术分享图片

 

出栈的过程

fb函数执行完成后,根据fa函数的运行状态,返回fa继续执行。

fa函数执行完成后,根据main函数的运行状态,返回main继续执行。

如图:

技术分享图片

 

二 函数变量的使用范围

  1 fa分配的内存可以被函数fb使用吗

 fa可以在栈区申请内存(局部变量), 可以在堆区申请内存(malloc), 可以在数据区申请内存(全局变量,字符串常量等)。 这些区的内存fb都可以使用吗?

    fb可以使用fa申请的这些内存。因为函数fb执行时,fa函数还没有return。所以所以内存空间都没有被析构。

   2 fb分配的内存可以被函数fa使用吗

  ①fb在栈上分配的内存,不能被fa使用。  因为fb函数return以后,栈上的内存就被析构了。int a=0; char * p = NULL;

  ②fb函数malloc的内存,可以被fa函数使用。因为malloc的内存放在堆中,fb执行结束后,内存没有被析构。malloc(sizeof(char)*10); //申请10字节内存

  ③fb函数中数据区内存,可以被fa函数使用。因为数据区内存,fb执行结束后,内存没有被析构,虽然fb中不会有全局变量,但是可以有字符串常量  char *pstr1 = "adfag";

PS: 可见,主调函数要想使用被调用函数分配的内存,需要用指针做函数参数或返回值,内存必须是堆区内存或数据区内存,栈区内存会被析构。

 三 C++编译器为每个应用程序建立几个内存四区?

  一个主程序有n函数组成,c++编译器会建立有几个堆区?有几个栈区?一个堆区,一个栈区,即为每一个应用建立一个内存四区。

   

 

函数调用模型

标签:开始   pst   ima   应用程序   建立   font   参数   函数调用   局部变量   

原文地址:https://www.cnblogs.com/fengxing999/p/10224710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!