栈,堆,静态区
对于内存我们可以简单的理解为分3个部分:
堆,栈和静态区。
有时大家常说的堆栈,就是栈,不是堆。
堆的英文是:heap
栈的英文是:stack,也翻译为堆栈
下面简单唠唠这三位仁兄:
**堆:**有malloc系列函数或者new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。它的特点呢是使用灵活,空间较大,但容易出错。
**栈:**保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束(这里是函数运行结束哦),这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
**静态区:**保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在(注意哦,是整个程序的生命周期内),由编译器在编译的时候分配(注意哦,是在编译的时候才分配)。
比如下面这种笔试中常出现的试题:
int Add(void)
{
static int b = 9;
int a = 8;
if (b == 0)
{
return 1;
}
printf("b:%d:c:%d\n",b--,a--); // 结果如何?
return 0;
}
因为static修饰的变量b,编译器把b存放在静态区,并且b的初始化只初始化一次;而变量a是临时变量,编译器把a存放在栈区,add函数每次在被调用后,a变量就会被初始化,所以呢,执行的结果应该已经明白了吧。
#include<stdio.h>
#include<string.h>
#include<windows.h>
int Add(void)
{
static int b = 9;
int a = 8;
if (b == 0)
{
return 1;
}
printf("b:%d:c:%d\n",b--,a--);
return 0;
}
int main(void)
{
while (1)
{
if (Add())
{
break;
}
Sleep(100);
}
system("PAUSE");
return 0;
}
b的值随着循环是不断减小的,a的值每次进来只是减一,这只是栈区的一个小小的例子。
并且static修改的变量b的生命周期是整个程序的运行周期,而临时变量a的生命周期是随着函数add的消亡而消亡。