zoukankan      html  css  js  c++  java
  • 函数调用模型

    一 函数调用模型

    入栈的过程

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

       

  • 相关阅读:
    Python Redis 五大数据类型
    Python 魔法方法
    Python 静态方法,类方法,属性方法
    Python 反射
    Python 中 封装,继承,多态
    Redis 事务
    Redis 哨兵集群
    装饰器,迭代器,生成器
    Flume与kafka集成
    hbase 可视化工具 HBaseXplorer---HbaseGUI
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10224710.html
Copyright © 2011-2022 走看看