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++编译器会建立有几个堆区?有几个栈区?一个堆区,一个栈区,即为每一个应用建立一个内存四区。

       

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10224710.html
Copyright © 2011-2022 走看看