• C语言的内存四区模型和函数调用模型


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

    然后将内存分为4个区

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

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

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

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

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

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

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

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

    函数的调用模型:

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

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

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

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

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

  • 相关阅读:
    Win7 华硕电脑自带摄像头无法打开 方法思路介绍
    P3520 [POI2011]SMI-Garbage
    二分图的最大匹配(模板)
    #数列分块入门 2
    数列分块入门#1
    线段树(标记下传乘法和加法)
    最小费用最大流
    最大流算法(模板)
    编译器出现/mingw32/bin/ld.exe:Permission denied 错误
    1298 圆与三角形
  • 原文地址:https://www.cnblogs.com/andyniu/p/7632608.html
Copyright © 2020-2023  润新知