• linux下C/C++程序的内存布局


    内核空间和用户空间:

      我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换。假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给我们使用,有一部分内存是固定分配给操作系统内核的,分配给操作系统的这部分内存我们叫它内核空间,除去内核空间以后用户能使用的内存叫用户空间,在linux 32环境下,高地址的1GB是固定给内核使用的,低地址的3GB才是给用户使用的。

    用户空间内存分配情况:

    各个内存分区的说明:

    内存分区说明
    程序代码区
    (code)
    存放函数体的二进制代码。一个C语言程序由多个函数构成,C语言程序的执行就是函数之间的相互调用。
    常量区
    (constant)
    存放一般的常量、字符串常量等。这块内存只有读取权限,没有写入权限,因此它们的值在程序运行期间不能改变。
    全局数据区
    (global data)
    存放全局变量、静态变量等。这块内存有读写权限,因此它们的值在程序运行期间可以任意改变。
    堆区
    (heap)
    一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()calloc()free() 等函数操作的就是这块内存,这也是本章要讲解的重点。

    注意:这里所说的堆区与数据结构中的堆不是一个概念,堆区的分配方式倒是类似于链表。
    动态链接库 用于在程序运行期间加载和卸载动态链接库。
    栈区
    (stack)
    存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

    举例:

    #include <stdio.h>
    
    char *str1 = "hello world";  //字符串在常量区,str1在全局数据区
    int n;  //全局数据区
    
    char* func(){
        char *str = "hello world";  //字符串在常量区,str在栈区
        return str;
    }
    
    int main(){
        int a;  //栈区
        char *str2 = "01234";  //字符串在常量区,str2在栈区
        char  arr[20] = "56789";  //字符串和arr都在栈区
        char *pstr = func();  //栈区
        int b;  //栈区
    
        return 0;
    }

      

  • 相关阅读:
    Java 如何有效地避免OOM:善于利用软引用和弱引用
    LRU缓存实现(Java)
    Java实现LRU(最近最少使用)缓存
    HashSet,TreeSet和LinkedHashSet的区别
    IIS-详解IIS中URL重写工具的规则条件(Rule conditions)
    IIS-代理
    IIS-新建网站
    IIS-反向代理配置&&插件安装
    IIS-C#项目环境搭建
    IIS-Windows10如何安装
  • 原文地址:https://www.cnblogs.com/418ks/p/10802184.html
Copyright © 2020-2023  润新知