• [转]C/C++程序的内存区域划分


    一个由C/C++编译的程序占用的内存分为以下几个区域:

    1、栈区(stack)

    由系统自动分配和释放,用于存放函数的参数值,局部变量值等。其在内存中是一块连续的存储区域,由低地址向高地址延伸。

    2、堆区(heap) 

    由程序员分配和释放,若程序员不释放,则程序结束时可能由操作系统回收。其存储空间在内存中是不连续,分配方式类似于链表。 

    3、静态区(static)

    又称全局区,程序结束后由系统释放,用于存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量则存储在相邻的另一块区域。 

    4、文字常量区

    程序结束后由系统释放,用于存储常量,字符串常量就是放在这里的。

    5、程序代码区

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

    #include <stdlib.h>
    #include <string.h>
    
    int a = 0;       // 全局初始化区.
    char *p1;        // 全局未初始化区.
    
    int main(void)
    {    
        int b;                       // 栈区.    
        char s[] = "abc";            // 栈区.    
        char *p2;                    // 栈区.
        char *p3 = "123456";         // 123456\0 在常量区, p3 在栈上.    
        static int c = 0;            // 静态(全局)初始化区.
    
        // 分配得来的 10 和 20 字节的区域就在堆区。    
        p1 = (char *)malloc(10);
        p2 = (char *)malloc(20);
    
        // 123456\0 放在常量区.
        // 编译器可能会将它与p3所指向的 "123456" 优化成一个地方.
        strcpy(p1, "123456");
    
        return 0;
    }
    
  • 相关阅读:
    Log4j中conversionPattern的含义
    log4j.xml写入数据库,只有SQL和参数,无其他信息
    windows下根据进程ID强制杀死进程
    github简单使用教程
    junit mockito
    获取oracle 随机数
    循环插入oracle 存储过程
    2.1. 创建GitHub账号
    oracle 复制表结构表数据
    命令模式
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2070203.html
Copyright © 2020-2023  润新知