Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68336
  • 博文数量: 30
  • 博客积分: 1260
  • 博客等级: 中尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 12:27
文章分类

全部博文(30)

文章存档

2010年(30)

我的朋友

分类: C/C++

2010-06-28 12:00:49

1.程序的内存分配
程序内存分为以下几个部分:
  • 栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注重它与数据结构中的堆是两回事,分配方式倒是类似于链表。
  • .bss区 — 存放未初始化的全局变量和未初始化的静态变量,程序结束由系统释放
  • .data区 — 已初始化的全局变量或静态变量
  • .rodata区 — 存放常量数据
  • .text区 — 代码段, 与.rodata不同在于这个段是可以执行的

例子程序

int a[10] = {1}; //.data区
int b[10]; //.bss区

main()
{
   int c[10] = {1}; //.data区
   static d[10]; //.bss区
   static e[10] = {1}; //.data区
   int f; //stack
   char *p; //stack
   char *p1 = "123456"; //p1在stack区, "123456\0".rodata区
   char *p2; //stack

   p2 = (char *)malloc(10);//分配出来的字节在堆区
}


以上这些信息通过objdump -x main | grep xxx可以看出,需要注意的是,.data与.rodata占用程序空间,这点通过readelf -a ./main 中的.data或.rodata的大小可以看出,因此实际使用时要多加注意.

2.static全局变量与普通全局变量的不同?static局部变量与普通局部变量的不同?static函数与普通函数的不同

前两个问题要从以下两点进行分析:

  • 作用域

static全局变量与普通全局变量的存储位置没有什么不同,他们的区别在于作用域的不同,static全局变量的作用域是该文件范围,而普通的全局变量可由其它文件引用.

  • 生存期

static局部变量与普通的局部变量的作用域是一样的,都只能供本函数使用,但是他们的存储区却是不同,未初始化的static局部变量保存于.bss区,而初始化过的static局部变量保存在.data区,而普通的局部变量保存在堆栈啊,函数调用完毕即释放空间,static局部变量的值不会释放.

至于static函数,也是个作用域的问题,申明了static的函数只能由本文件使用.

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