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

内核空间和用户空间:html

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

用户空间内存分配状况:程序员

各个内存分区的说明:数据结构

 

内存分区 说明
程序代码区
(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; }
相关文章
相关标签/搜索