函数调用模型

一 函数调用模型

入栈的过程

程序开始运行时,操作系统会找到程序的入口函数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++编译器会建立有几个堆区?有几个栈区?一个堆区,一个栈区,即为每一个应用建立一个内存四区。

   

 

posted on 2019-01-05 20:17  锋邢天下  阅读(407)  评论(0编辑  收藏  举报

导航