十一、C内存四区模型

转载于:https://blog.csdn.net/wu5215080/article/details/38899259

内存四区模型

                           图一、内存四区模型
流程说明
一、操做系统把物理硬盘代码load到内存
二、操做系统把c代码分红四个区
三、操做系统找到main函数入口执行程序员

 

 

一、内存四区:

一个由c/C++编译的程序占用的内存分为如下几个部分
一、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操做方数据结构

式相似于数据结构中的栈。
二、堆区(heap: 通常由程序员分配释放, 若程序员不释放,程序结束时可能由OS回   收 。函数

注意它与数据结构中的堆是两回事,分配方式却是相似于链表。spa

三、数据区:主要包括静态全局区和常量区,若是要站在汇编角度细分的话还能够分为不少小的区。
           全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变操作系统

量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另外一块区域。 .net

程序结束后有系统释放
常量区 :常量字符串就是放在这里的。 程序结束后由系统释放指针

四、代码区:存放函数体的二进制代码。blog

二、堆栈的生长方向:

  一、堆栈的生长方向和存放数据增加方向不同生命周期

  

                         图二、堆栈的生长方向内存

 

二:函数调用模型

变量三要素是:名称、大小、做用域。那么变量的生命周期是多长呢?

编译器是如何管理每一个函数间变量的生命周期呢?

要研究变量的生命周期,而变量通常又是在函数中定义分配空间的。

所以下面研究一下变量做为函数参数和返回值传递分析

下面咱们具体总结一下,各个函数的变量的生命周期

main里面的变量分配内存,函数fa(),函数fb()中的变量分配的内存空间它们的生命周期都是多长呢?

上述图1,已经说明了内存主要分为四区,所以每一个函数中变量在堆栈的生命周期是不一样的,

同时在函数调用的时候,先执行的函数最后才执行完毕

char*fa()
{

char*pa = "123456";//pa指针在栈区,“123456”在常量区,该函数调用完后指针变量pa就被释放了
 char*p = NULL;     //指针变量p在栈中分配4字节
 p=(char*)malloc(100);//本函数在这里开辟了一块堆区的内存空间,并把地址赋值给p
 strcpy(p, "wudunxiong 1234566");//把常量区的字符串拷贝到堆区
 return p;//返回给主调函数fb(),相对fa来讲fb是主调函数,相对main来讲,fa(),fb()都是被调用函数
}
char*fb()
{
 char*pstr = NULL;
 pstr = fa();
 return pstr;//指针变量pstr在这就结束
}

void main()

 char*str = NULL;
 str = fb();
 printf("str = %s\n",str);
 free(str);    //防止内存泄露,被调函数fa()分配的内存存的值经过返回值传给主调函数,而后主调函数释放内存
 str = NULL;//防止产生野指针
 system("pause");
}

总结:

一、主调函数分配的内存空间(堆,栈,全局区)能够在被调用函数中使用,能够以指针做函数参数的形式来使用

二、被调用函数分配的内存空间只有堆区和全局区能够在主调函数中使用(返回值和函数参数),而栈区却不行,由于栈区函数体运行完以后

这个函数占用的内存编译器自动帮你释放了。

三、必定要明白函数的主被调关系以及主被调函数内存分配回收,也就是后面接下几篇总结的函数的输入输出内存模型

相关文章
相关标签/搜索