内存四区模型

Posted 小淘气儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存四区模型相关的知识,希望对你有一定的参考价值。

注:一个程序只建立一个内存四区,所有函数共用这个内存四区。

内存四区如下:

一、全局区

全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,

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

该区域在程序结束后由操作系统释放; 

    常量区——字符串常量和其他常量的存储位置,程序结束后由操作系统释放。

    在代码运行期间,C编译器会做优化处理,

1)、当定义两个不同字符串时,全局区会开辟两个内存空间存放字符串,

2)、当定义两个相同的字符串时,全局区只开辟一个内存空间,变量共用这个内存空间。

二、堆

一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能有操作系统回收;

函数内部动态分配内存空间,其他函数可以使用,因为在该函数运行结束后,这片内存空间不被释放。

三、栈(临时区)

  由编译器自动分配释放,存放函数的参数值,局部变量的值等;

  函数内部静态分配内存空间,其他函数不能使用,因为在该函数运行结束后,这片内存空间被释放掉了。

四、代码区

 存放函数的二进制代码;

 

栈区开口朝向问题:

#include <stdio.h>

void main(void){
    int i=10;
    int j=10;
    printf("i-->%d;\\n",&i);
    printf("j-->%d;\\n",&j);
    if((&i-&j)>0){
        printf("开口朝下;\\n");
    }else if ((&i-&j)<0){
        printf("开口朝上;\\n");
    }else{
        printf("error;\\n");
    }
    return ;
}

无论栈区开口朝上还是朝下,栈区内的数组内存空间的开头地址都是最下面的,如图:

以上是关于内存四区模型的主要内容,如果未能解决你的问题,请参考以下文章

C++的程序内存模型——四区

C++的程序内存模型——四区

C++的程序内存模型——四区

内存四区模型

C 语言内存四区原理 ( 内存四区建立流程 )

C++的程序内存模型