函数——堆栈内存分配
1) 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
2) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
3) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
4) 文字常量分配在文字常量区,程序结束后由系统释放。
5)程序代码区。
#include "stdio.h"
/*** 下面代码测试了局部变量、全局变量、静态局部变量的作用域
***/
int i;
int j;
void func();
int _tmain(int argc, _TCHAR* argv[])
{
//int i;
static int k;
int j=1;
func();
func();
printf("i:%d\n",i);
printf("j:%d\n",j);
printf("k:%d\n",k);
return 0;
}
void func()
{
static int i = 0;
int j = 2 ;
i++;
j++;
printf("func i = %d \n",i);
printf("func j = %d \n",j);
}
/**执行结果
func i = 1 //静态局部变量的存储位置在 静态存储区,一直到程序执行完了才释放
func j = 3 //局部变量的存储位置在 栈区,函数结束后会被释放
func i = 2
func j = 3 //局部变量需要初始化,如果不初始化,编译成功但是执行会出错
i:0 //全局变量可以不初始化,默认为0
j:1 //优先局部变量。不报错。
k:0 //静态局部变量可以不初始化 默认为0
**/