• 程序中的三国天下


    程序中的栈

    • 栈是现代计算机程序里面最为重要的概念之一
    • 栈在程序中用于维护函数调用上下文
    • 函数中的参数和局部变量存储在栈上
    • 栈保存了一个函数调用所需的维护信息
      • 参数
      • 返回地址
      • 局部变量
      • 调用上下文
      • ...

    函数调用过程

    • 每次函数调用都对应一个栈上的活动记录
      • 调用函数的活动记录位于栈的中部
      • 被调函数的活动记录于栈的顶部

    函数调用的栈变化

    从main()开始运行

    当main()调用f()

    当从f()调用中返回main()

    返回局部变量的地址和数组是没有意义的

    函数调用栈上的数据

    • 函数调用时,对应的栈空间在函数返回前是专用的
    • 函数调用结束后,栈空间将被释放,数据不再有效

    程序中的堆

    • 堆是程序中—块预留的内存空间,可由程序自由使用
    • 堆中被程序申请使用的内存在被主动释放前将—直有效

    为什么有了栈还需要堆?

    • 栈上的数据在函数返回后就会被释放掉,
    • 无法传递到函数外部,如:局部数组
    • C语言程序中通过库函数的调用获得堆空间
      • 头文件: malloc.h
      • malloc --以字节的方式动态申请堆空间
      • free --将堆空间归还给系统

    系统对堆空间的管理方式

    • 空闲链表法,位图法,对象池法等等

    程序中的静态存储区

    • 静态存储区随着程序的运行而分配空间
    • 静态存储区的生命周期直到程序运行结束
    • 在程序的编译期静态存储区的大小就已经确定
    • 静态存储区主要用于保存全局变量和静态局部变量
    • 静态存储区的信息最终会保存到可执行程序中

    例子1:静态存储区的验证

    #include <stdio.h>  
      
    int g_v = 1;  
      
    static int g_vs  = 2;  
      
    void f()  
    {  
        static int g_vl = 3;  
          
        printf("%p
    ", &g_vl);  
    }  
      
    int main()  
    {  
        printf("%p
    ", &g_v);  
          
        printf("%p
    ", &g_vs);  
          
        f();  
          
        return 0;  
    }  
    

    小结

    • 栈,堆和静态存储区是程序中的三个基本数据区
    • 栈区主要用于函数调用的使用
    • 堆区主要是用于内存的动态申请和归还
    • 静态存储区用于保存全局变量和静态变量
  • 相关阅读:
    ios状态栏的一些操作
    ios对于枚举的使用
    assign,copy,strong,weak,nonatomic的具体理解
    在c中break的使用
    object-c中的assign,retain,copy,atomic,nonatomic,readonly,readwrite以及strong,weak
    对于atomic nonatomic assign retain copy strong weak的简单理解
    第四百三十九天 how can I 坚持
    第四百三十八天 how can I 坚持
    第四百三十七天 how can I 坚持
    第四百三十六天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9213236.html
Copyright © 2020-2023  润新知