嵌入式linux菜鸟养成记(二)

时间:2021-07-03 18:57:29

关于上一篇文章提出的问题

  1. 程序要想运行的话,必须得把程序从rom或者flash中拷贝到ram内存中,cpu从ram开始读取程序,并执行。那么问题来了,程序在内存中是如何存在的,也就是说,程序在内存中有哪些分区,变量,常量······是如何分类并分布存在的?

    从pc机上向单片机烧写程序,一般是将程序烧写到单片机内部的rom或者flash中,单片机想要运行该程序的话,需要将程序从rom或者flash中拷贝到ran内存中。程序在内存中主要分为下面几个区域:

    栈区:分配局部变量空间;

    堆区:用于分配程序员申请的内存空间;

    静态区:分配静态变量,全局变量空间;

    只读区:分配常量,程序代码空间;

    其它区:其它区域。

    具体情况如下例所示:

  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); 堆
 }
  1. 在C语言中堆栈是存在于哪里的概念,它们的作用和区别是什么?

    我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。

    然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。

    堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。

    以上对堆栈的理解来自于“51黑电子论坛”一网友的高见,具体见:
    堆栈入门——堆和栈区别
    http://www.51hei.com/bbs/dpj-37256-1.html
    (出处: 单片机论坛)

    2017年03月06日,未完待续。