首页  

程序各个段text data bss stack heap     所属分类 c 浏览量 848
size查看可执行文件大小
size hello
   text	   data	    bss	    dec	    hex	filename
   1188	    540	      4	   1732	    6c4	hello
   
可执行文件 分三部分
.text 代码段 存放代码 一般只读
.data 数据段 存放全局初始化变量,常量,以及全局或局部静态变量,只初始化一次
.bss  BSS段 存放全局未初化数据 用0初始化
Block Started by Symbol segment

程序运行时才有 堆(heap)和栈(Stack)


.stack 
栈区 存放局部变量,函数参数,返回值等
编译器自动分配释放
栈区地址 从高地址向下增长

.heap 
堆区 用来动态内存分配
如malloc new申请的内存,由程序员分配释放
堆区地址向上增长


程序执行过程
代码区的指令依次执行,代码由操作码和操作数组成
操作码决定是顺序执行,还是跳转,还是循环等
操作数可能是立即数,即具体的数直接包含在代码中,
或者是局部变量,则在栈区分配空间,然后引用该数据地址执行,
或者是BSS,DATA段的数据,同样引用其地址执行

代码有不同的操作,因此程序在内存中执行时,才分成不同的区,以便节约空间或访问方便
对于全局变量和静态变量,一般不会更改其值,但整个执行过程都需要访问,就单独放到一个区进行管理
临时变量生命周期短,需要频繁的操作,则统一放到栈区
用户自由分配使用的空间统一放在堆区,便于管理

int a = 0; //a在全局已初始化数据区.data
char *p1;  //p1在.bss(未初始化全局变量)
main() {
  int b;   // b在栈区 .stack
  // 字符串常量 abc,存储在已初始化数据区
  // s为数组变量,存储在栈区 
  char s[] = "abc";
  char *p1,p2;         //p1,p2在栈区
  char *p3 = "123456"; // 123456 在已初始化数据区,p3在栈区
  static int c =0;     // C为全局(静态)数据,已初始化数据区
  // 静态数据会自动初始化
  p1 = (char *)malloc(10);// 动态分配的10个字节 堆区
  p2 = (char *)malloc(20);// 动态分配的20个字节 堆区
  // p1,p2是局部变量 栈 
  free(p1);
  free(p2);
} 
  

堆和栈的区别 Linux可执行文件信息查看

上一篇     下一篇
C语言动态内存分配与释放

exit atexit 及 abort

C语言stdlib使用实例

C++左值和右值

springboot jar包无法解压

2021年1到8月主要税收收入