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

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

然后将内存分为4个区

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

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

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

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

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

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

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

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

函数的调用模型:

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

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

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

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

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

原文地址:https://www.cnblogs.com/andyniu/p/7632608.html