zoukankan      html  css  js  c++  java
  • 代码区、常量区、静态区(全局区)、堆区、栈区?

    一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域

    • 代码区:存放程序的二进制代码,即CPU执行的机器指令,并且是只读的。

    • 常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)

    • 全局区 或 静态区:静态变量和全局变量的存储区域是一起的, 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放.

    • 堆区:由程序员动态内存分配,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏.(注意它与数据结构中的堆是两回事)

    • 栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。

    代码例子

    int a = 0; //全局初始化区
    char * p1; //全局未初始化区
    int main()
    {
    int b; //栈
    char s[] = "abc"; //栈
    char * p2; //栈
    char p3 = "123456"; // 123456/0在常量区,p3在栈上。
    static int c =0; //全局(静态)初始化区
    p1 = new char[10]; // 堆
    p2 = new char[20]; // 分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); // 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    return 0;
    }

    堆和栈的区别:

    使用就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
    使用就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由 度大。 (经典!)



  • 相关阅读:
    CentOS7下安装MySQL
    Jmeter测试SOAP协议(Jmeter 3.3)
    新版谷歌浏览器( 60.0.3088.3)怎样获取安全证书
    springboot 修改属性配置的三种方法
    jdbc、数据库驱动、mybaties、数据库连接池之间的关系
    Java程序编译和运行的过程
    zk在kafka中的作用
    zk简述
    HttpWebRequest Post请求webapi
    本地数据库(sql server)插入一条新数据时,同步到服务器数据库
  • 原文地址:https://www.cnblogs.com/clemente/p/10756724.html
Copyright © 2011-2022 走看看