加载中…
个人资料
老徐
老徐
  • 博客等级:
  • 博客积分:0
  • 博客访问:824,763
  • 关注人气:156
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

[C/C++]进程如何使用内存

(2012-10-15 14:59:40)
标签:

堆栈

函数参数与局部变量

kernel

内存

it

分类: C/CPlusPlus
所有进程(执行的程序)都必须占用一定数量的内存,对任何一个普通进程来讲,
它都会涉及到5 种不同的数据段:
栈(Stack)              堆(Heap)               BSS(Block Started by Symbol)               数据段             代码段

*****************
*栈(向下扩展)*

*      *
*
****************
      
     
*****************
   
   *
*堆(向上扩展)*
*****************
          BSS        
*
*****************
        数据段     
*
*****************
      
     
*****************
         代码段     *
*****************

ProcMem.c
#include<stdio.h>
#include<malloc.h>
#include<unistd.h>
int bss_var;
int data_var0=1;
int bss_var1;
int main(int argc,char **argv)
{
  printf("below are addresses of types of process's mem\n");
  printf("Text location:\n"); 
  printf("\tAddress of main(Code Segment):%p\n",main);
  printf("____________________________\n");
  int stack_var0=2;
  printf("Stack Location:\n");
  printf("\tInitial end of stack:%p\n",&stack_var0);
  int stack_var1=3;
  printf("\tnew end of stack:%p\n",&stack_var1);
  printf("____________________________\n");
  printf("Data Location:\n");
  printf("\tAddress of data_var(Data Segment):%p\n",&data_var0);
  static int data_var1=4;            //静态变量和全局初始化变量都放在数据段
  printf("\tNew end of data_var(Data Segment):%p\n",&data_var1);

  printf("____________________________\n");
  printf("BSS Location:\n");
  printf("\tAddress of bss_var:%p\n",&bss_var);
  printf("\tAddress of bss_var:%p\n",&bss_var1);
  printf("____________________________\n");
  char *b = sbrk((ptrdiff_t)0);
  printf("Heap Location:\n");
  printf("\tInitial end of heap:%p\n",b);
  brk(b+4);
  b=sbrk((ptrdiff_t)0);
  printf("\tNew end of heap:%p\n",b);
  return 0;
 }

编译运行结果如下:
[qfxu@ESW2-10 MyCCPP]$ gcc -o aaa -g ProcMem.c
[qfxu@ESW2-10 MyCCPP]$ ./aaa
below are addresses of types of process's mem
Text location:
        Address of main(Code Segment):0x400568
____________________________
Stack Location:
        Initial end of stack:0x7fffffede1a4                                 //向下生长(由高地址向低地址扩展)
        new end of stack:0x7fffffede1a0
____________________________
Data Location:
        Address of data_var(Data Segment):0x600c0c              //向生长(由低地址向高地址扩展)
        New end of data_var(Data Segment):0x600c10
____________________________
BSS Location:
        Address of bss_var:0x600c24                                     
//向生长(由低地址向高地址扩展)
        Address of bss_var:0x600c28
____________________________
Heap Location:
        Initial end of heap:0xb27f000                                       
//向生长(由低地址向高地址扩展)
        New end of heap:0xb27f004
[qfxu@ESW2-10 MyCCPP]$

利用size命令查看各个段的大小
[qfxu@ESW2-10 MyCCPP]$ size aaa
   text    data     bss     dec     hex filename
   2031     524      24    2579     a13 aaa
[qfxu@ESW2-10 MyCCPP]$
结论:除了栈是向
下生长(由高地址向低地址扩展),
            堆、BSS和数据段都是
/向上生长(由低地址向高地址扩展)

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有