C语言栈、堆和静态区

来源:互联网 发布:头像源码怎么用 编辑:程序博客网 时间:2024/06/04 20:40

  有关栈、堆的一些东西,一直搞不清,看了些网上的文章,很有帮助,把它们综合一下在这里

   很多概念不清楚,大致写个东西,半个月后回来重写,到时候应该会有更清晰的理解

   (C语言中文网 作者admin)堆的英文是heap;栈的英文是stack,也翻译为堆栈。堆和栈都有自己的特性,这里先不做讨论。再打个比方:一层教学楼,可能有外语教室,允许外语系学生和老师进入;还可能有数学教师,允许数学系学生和老师进入;还可能有校长办公室,允许校长进入。同样,内存也是这样,内存的三个部分,不是所有的东西都能存进去的。
静态区:保存自动全局变量和static 变量(包括static 全局和局部变量)。静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
堆:由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。
在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。

一位前辈写的例子

         main.cpp 
  int a = 0; 全局初始化区 
  char *p1; 全局未初始化区 
  main() 
  { 
  int b; 栈 
  char s[] = "abc"; 栈 
  char *p2; 栈 
  char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
  static int c =0; 全局(静态)初始化区 
  p1 = (char *)malloc(10);  堆
  p2 = (char *)malloc(20);  堆
  } 

       即 栈是系统自动分配空间的,例如我们定义一个 int num;系统会自动在栈上为其开辟空间。而堆(则是程序员根据需要自己申请的空间,例如用malloc函数等开辟的空间。同时由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,易出错。

       关于栈与系统堆栈,在《0day安全软件漏洞分析技术》这本书的第四章里讲的很清楚。

    接下来说递归中栈的应用,和上面的的概念可能会有些混淆,例如如下程序:

#include<stdio.h>
#pragma warning (disable :4996)


int age(int n)
{
    int a;
    if(n==1)
    {
        a=10;
    }
    else 
        a=age(n-1)+2;
    return a;
}
int main()
{
    int age_i,age_b;
    printf("input the age of the tenth person\n");
    scanf("%d",&age_b);
    age_i=age(age_b);
    printf("%d",age_i);
}
  

开始运行(省略变量等进栈):

1、创建main函数栈帧(设age_b=3)

2、创建age()栈帧   a:n=3创建 age()栈层a=age(2)+2

                               b:n=2创建age()栈层 a=age(1)+2

                               c:n=1 得到a=10;

3、A:弹出a=10至临时存储,删除c层,露出b栈层

     B:弹出a=a+2至临时存储,删除b层,露出a层

     C:弹出a=a+2至临时存储,删除a层,露出main层,传值至实参得到age_i;

结束





0 0
原创粉丝点击