通过一个小例子来简单理解C语言中的内存空间管理

2020-01-06 14:04:43王冬梅

栈 (stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。注意:栈空间是向下增长的,每个线程有一个自己的栈,在linux上默认的大小是8M,可以用ulimit查看和修改。

栈系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。

以下是一个简单的c文件,环境是OS--Linux,ARCH--PPC

 

 
  1. ##sta.c###  #include <stdio.h> 
  2.   int kk[100] = {1,2,3,4,5}; 
  3. int tt[100];  int ii; 
  4.   int main() 
  5. {  int i; 
  6. static int si;  char a[10]= "abcd"; 
  7. printf("i is %d/n");  return 0; 
  8. }   
  9.    
  10. 经过gcc -S sta.c之后,生成的汇编代码如下   
  11. ##sta.s###   
  12.    
  13. .file "sta.c"  .gnu_attribute 4, 2 
  14. .gnu_attribute 8, 3  .globl kk 
  15. .section ".data"  .align 2 
  16. .type kk, @object  .size kk, 400 
  17. kk:  .long 1 
  18. .long 2  .long 3 
  19. .long 4  .long 5 
  20. .zero 380  .lcomm si.2254,4,4 
  21. .type si.2254, @object  .section .rodata 
  22. .align 2  .LC1: 
  23. .string "i is %d/n"  .align 2 
  24. .LC0:  .string "abcd" 
  25. .zero 5  .section ".text" 
  26. .align 2  .globl main 
  27. .type main, @function