Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1368927
  • 博文数量: 704
  • 博客积分: 10140
  • 博客等级: 上将
  • 技术积分: 6230
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 20:41
文章分类

全部博文(704)

文章存档

2013年(1)

2012年(16)

2011年(536)

2010年(151)

分类: C/C++

2011-06-23 12:08:29

高地址(3G)

...

stack

.

.

.

heap
bss
data
rodata
text

.

.

.

低地址(0)

 

在用户存储空间,一个c程序的映射可分为6部分,代码段、常量段、数据段、bss段、堆、栈。

 

其中:

常量主要是指字符串常量;

数据是指函数外定义的、初始化过的变量;

bss是指函数外定义的、未初始化过的变量;

局部变量、子函数返回地址、传给子函数的参数都在栈中分配,方向由高地址向低地址;

动态分配的空间在堆中,方向由低地址向高地址。

 

运行以下程序,程序各部分在内存中的相对位置一目了然。

 

#include
#include

int i = 5, j;

void subfunc(int a)
{
    ("arg:%p\nsubfunc:%p\n",&a, subfunc)
}

int main(void)
{
    int tmp = i - 1;
    char *p = "abcde";
    int a[5];
    
    ("data:%p\nbss:%p\nautovar:%p\nconst:%p\narray:%p\n",\
            &i, &j, &tmp, p, &a[0]);
    
    p = malloc(sizeof(a) / sizeof(a[0]));

    for (; tmp >= 0; tmp--)
        p[tmp] = a[tmp];
  
    ("heap:%p\nfunc:%p\n", p, main);

    subfunc(tmp);

    free(p);
    return 0;
}

 

阅读(720) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~