函数、全局变量、局部变量和动态内存的特点归纳
来源:互联网 发布:php命令行死循环 编辑:程序博客网 时间:2024/05/16 09:06
生命周期
作用域
默认值
内存区域
链接属性
全局变量(定义在函数外部的变量)
普通全局变量
程序运行开始创建,程序退出才销毁
从定义变量处到本文件结尾都能使用
0
全局变量区
外部(其他文件也能用)
静态全局变量
程序运行开始创建,程序退出才销毁
从定义变量处到本文件结尾都能使用
0
全局变量区
内部(只能本文件使用)
局部变量
(定义在函数内部的变量,包括形参)
普通局部变量
进入函数创建,退出函数销毁
栈
随机值
局部变量区
静态局部变量(不常用)
第一次执行该语句创建,程序结束才销毁
从定义变量处到本文件结尾都能使用
0
全局变量区
动态内存
调用malloc()创建,free()销毁
随机值
堆
函数
普通函数(外部函数)
代码段
外部(外部文件引用)
静态函数(内部函数)
代码段
内部(内部文件引用)
内存块
代码段
全局变量区
栈
堆
(上图并无逻辑关联)
1.全局变量:定义在函数外部的变量,如:
int g_a ; //普通全局变量
static int g_sa; //静态全局变量
两者之间的区别在于链接属性(static修饰的是链接属性).
1_1:普通全局变量:可以被外部文件使用。当已经在同一个解决方案中的文件2中定义了普通全局变量(int g_a ;),么在文件1中可以通过(extern int g_a;)来引用它。
1_2:静态全局变量:只能被本文件使用。当在文件1中定义了静态全局变量(static int g_sa;)时,有在本文件中可以引用该变量,而在文件2中并不能通过(extern int g_sa;)来引用静态全局变量。
2.局部变量:定义在函数内部的变量,包括形参。如:
void Fun()
{
int a = 0;// 普通局部变量
++a;
printf("%d\n",a);
}
void Fun2 ()
{
static int a = 0;// 静态局部变量
++a;
printf("%d\n",a);
}
Int main()
{
For(int i=0;i<10;i++)
{
Fun();
Fun2();
}
}
2_1:普通局部变量:生命周期短,进入函数时创建、退出函数即销毁。且作用域仅仅是在函数内部,存放在栈里,且初始值(未初始化)为随机值。在上述的程序当中,结果为输出十次的1.
2_2:静态局部变量:生命周期长,第一次执行语句时创建,程序结束时销毁。存放在全局(静态)变量区,且初始值为0。在上述的程序当中,结果为输出1~10.
3.动态内存:调用malloc()(还有calloc()和realloc())时创建,free()销毁.存放在堆中,且初始值为随机值。
4.函数:我们着重考虑它的内存区域和链接属性。
4_1:普通函数(外部函数):能够被外部文件引用。存放在代码段里,一般都写在.h文件里,可供外部文件使用。
4_2:静态函数(内部函数):只能被本文件引用。存放在代码段里,不想被外部函数使用,可以在函数声明部分的前头加上static (静态关键字)。
- 函数、全局变量、局部变量和动态内存的特点归纳
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static修饰全局变量 局部变量和函数时候的区别
- static 修饰全局变量、局部变量和函数的区别
- python 函数的局部变量和全局变量 global
- python中有关函数的全局变量和局部变量
- python函数全局变量和局部变量
- 3.6Javascript函数-局部变量和全局变量
- javascript函数之局部变量和全局变量
- PHP static静态局部变量和静态全局变量的特点总结
- static全局变量与普通的全局变量、static局部变量和普通局部变量、static函数与普通函数的区别
- 全局变量、局部变量、静态局部变量、静态全局变量、外部变量、外部函数和静态函数
- malloc/free与 new/delete 内存的分配方式 多态类中的虚函数表 全局变量和局部变量
- 局部变量和全局变量
- 局部变量和全局变量
- 全局变量和局部变量
- spring websocket开发实践
- 死锁
- 《机器学习》阅读心得——八、集成学习
- Java import 导入包中类
- PHP实现排序算法----直接插入排序(Straight Insertion Sort)
- 函数、全局变量、局部变量和动态内存的特点归纳
- 用java编写的心形
- MyCat通信模块
- 过滤器和拦截器的区别
- JZOJ1441. 送披萨(2017.8B组)
- hadoop初识之十:mapreduce编程模型与数据传输格式
- js实现小方块上下左右移动
- 【JZOJ 5282】【清华集训2017模拟】等差划分数
- Java面试题全集(上)