Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165256
  • 博文数量: 26
  • 博客积分: 1225
  • 博客等级: 中尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-06 21:11
文章分类

全部博文(26)

文章存档

2018年(2)

2014年(1)

2011年(3)

2010年(2)

2009年(1)

2008年(17)

我的朋友

分类: C/C++

2008-09-12 14:32:28

 

1、程序代码区:存放函数体的二进制代码。  

2、全局区数据区:全局数据区划分为三个区域。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。

3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

4、堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

5、命令行参数区:存放命令行参数和环境变量的值。   

    关于局部的字符串常量是存放在全局的常量区还是栈区,不同的编译器有不同的实现。可以通过汇编语言察看一下。不过vc环境下,局部常量就像局部变量一样存储于栈中,全局常量、字符常量存储于文字常量区。TC在常量区。

    在linux下:可以通过参数-c来编译生成汇编文件。如:  
    gcc -c *.c
    gcc *.o -Map test.txt -o test.elf
    用文本编辑器查看test.txt文件,你就看到那些bss段,data段,text段等信息了,但是没有堆栈段相关信息,用objdump命令查看.o文件的反汇编后的信息,或者用gcc -S *.c,查看各个.S文件就明白了。

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