读书人

C程序内存储器布局

发布时间: 2012-09-11 10:49:03 作者: rapoo

C程序内存布局

1、堆和栈的区别,堆和栈的最大限制

??? 堆主要用来分配动态内存,操作系统提供了malloc等内存分配机制来供程序员进行堆内存的分配,同时,堆内存的释放需要程序员来进行。malloc分配的是虚拟地址空间,和用到的实实在在的物理内存是两码事,只有真正往空间里写东西了,os内核会触发缺页异常,然后才真正得到物理内存。32位Linux系统总共有4G内存空间,Linux把最高的1G(0xC0000000-0xFFFFFFFF)作为内核空间,把低地址的3G(0x00000000-0xBFFFFFFF)作为用户空间。malloc函数在这3G的用户空间中分配内存,能分配到的大小不超过3G,需除去栈、数据段(初始化及未初始化的)、共享so及代码段等占的内存空间。堆的地址空间是由低向高增长的(先分配低地址)。我用以下程序进行测试:

  • #include?<stdio.h>?
  • #include?<stdlib.h>?

  • char bss_1[40];?
  • static double bss_2;?
  • int?data_1?=?13;?
  • static long data_2?=?2001;?

  • int?main(int argc, char *argv[])?
  • {?
  • ????int?stack_1?=?3,?stack_2,?*heap_1,?*heap_2;?
  • ????heap_1?=?malloc(sizeof(stack_1));?
  • ????heap_2?=?malloc(sizeof(stack_1));?
  • ????bss_1[5]?=?stack_1;?
  • ????bss_2?=?2.0?*?data_1;?
  • ????printf("stack segment: stack_1:%p, stack_2:%p\n",?&stack_1,?&stack_2);?
  • ????printf("heap segment: heap:heap_1:%p, heap_2:%p\n",?heap_1,?heap_2);?
  • ????printf("bss segment: bss_1:%p, bss_2:%p\n",?bss_1,?&bss_2);?
  • ????printf("data segment: data_1:%p, data_2:%p\n",?&data_1,?&data_2);?
  • ????printf("the stack top is near %p\n",?&stack_1);?
  • ????return 0;?
  • }运行结果:
    stack segment: stack_1:0xbfab012c, stack_2:0xbfab0128
    stack segment: stack_1:0xbfb9e2ec, stack_2:0xbfb9e2e8
    heap segment: heap:heap_1:0x8c56008, heap_2:0x8c56018
    bss segment:? bss_1:0x804a040, bss_2:0x804a028
    data segment: data_1:0x804a018, data_2:0x804a01c
    the stack top is near 0xbfb9e2ec

    由此可见:从上到下(地址从高到低)依次为栈(函数内部局部变量),动态链接库,堆(动态分配内存),bss段(存未初始化的全局变量),数据段(存初始化的全局变量),文本段(存代码)

  • 读书人网 >编程

    热点推荐