zoukankan      html  css  js  c++  java
  • C语言的内存四区模型和函数调用模型

    首先是操作系统将代码程序加载到内存中

    然后将内存分为4个区

    栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放。

    堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构。

    全局区,静态区,常量区(字符串存放的位置),程序结束后,有操作系统释放

    代码区,存放函数体的二进制代码。

    最后,操作系统找到main函数的入口,就开始代码的执行。

    一般内存四区中的栈的开口方向是向下的。为什么要这样设计呢,因为设计栈的方向向下,可以给应用程序设定栈的大小,这样就可以避免栈溢出。

    不管栈是开口向上还是开口向下,BUFF的增长方向都是向上的。可以通过代码测出来。

    如果栈的开口方向向下,那么BUFF的基址在下面,如果栈的开口方向向上,BUFF的基址也在下面,也就是说,不管栈的开口方向朝那里,BUFF的基址都在下面,

    函数的调用模型:

    在操作系统调用main函数的时候,会将main函数的返回地址和参数入栈,然后开始直行main函数,如果在main函数中调用了其他函数,会先将main函数的运行状态入栈,然后将被调用函数的返回值入栈,被调用函数的参数入栈,然后去执行被调用函数,如果还有其他调用函数,过程也是类似的。

    在main函数中分配的内存,被调用函数是可以使用的。

    main函数可以在栈上,堆上,全局区上进行分配内存,这些内存是可以被函数中被调用函数使用的。

    而在被调用函数中栈上分配的内存,不能被主调函数使用,像堆上,还有全局区上分配的内存,都可以供主调函数使用,通过间接赋值的方式将内存的首地址传递出来就可以了。

    这些都是比较容易理解的内容。

  • 相关阅读:
    SQLSERVER 的表分区(水平) 操作记录2
    GraphQl in ASP.NET Core
    初始认知学习 .net core 逐步加深
    C# 关于使用JavaScriptSerializer 序列化与返序列化的操作
    Nginx、IIS 相关命令
    SqlServer:查询指定表所有外键关联表信息
    centos 重启宝塔命令
    c# 根据日志中的方法信息,反射再次执行相关方法
    jackson 下载地址记录
    【设计模式】六大原则
  • 原文地址:https://www.cnblogs.com/andyniu/p/7632608.html
Copyright © 2011-2022 走看看