堆,栈,静态区

栈,堆,静态区

对于内存我们可以简单的理解为分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的消亡而消亡。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值