#粤嵌星计划#第四十七天打卡@粤嵌
作者:王伟
学习内容及概括
#include <stdio.h>
#include <stdlib.h>
进程(运行中的程序)的内存映像(布局):
1、命令行参数和环境变量
2、栈
3、堆
4、共享内存
5、数据段(BSS,DATA)
6、代码段
变量的存储类 哪儿定义 内存区 如何分配
----------------------------------------------------------------------------------------
1. 自动变量 函数内 栈 调用函数时由系统自动分配和回收
2. 寄存器变量 函数内 寄存器 自动分配和回收
3. 局部静态变量 函数内 数据区 进程启动时分配(只分配一次,直到进程结束)
4. 全局变量 函数外 数据区 进程启动时分配(只分配一次,直到进程结束)
5. 全局静态变量 函数外 数据区 进程启动时分配(只分配一次,直到进程结束)
6. 动态分配变量 函数内分配 堆 使用 malloc 系列函数分配
// 全局变量,函数外定义
int e;
// 全局静态变量,函数外定义使用 static 关键字修饰
static int f;
int main(void)
{
// 在函数内部(包含形参)定义的变量,默认就是自动变量,也可以使用关键字 auto
int a; // 自动变量(省略了 auto)
auto int b; // 自动变量(使用了 auto)
// 寄存器变量,由 register 修饰
// 对寄存器变量的访问是快速的
// 但会占用 CPU 的宝贵寄存器资源,对系统的整体性能有损失
// 建议少用或不用
// 现代的编译器可能并不真正地为这种变量专门分配寄存器,而是使用其它的内存
register int c;
// 局部静态变量,函数内部定义的使用 static 关键字修饰的变量
static int d;
//动态分配变量,需要明确使用free()函数释放内存。
int *p = (int *)malloc(100);
return 0;
}
变量的生存期:变量从分配内存开始到内存释放
变量的作用域:变量的可见区域,表示的是变量的可访问性。
变量的储存类生存期作用域连接性
--------------------------------------------------------------------------------------------------------
1、自动变量临时定义点到函数结束无
2、寄存器变量临时定义点到函数结束无
3、局部静态变量永久定义点到函数结束无
3、全局变量永久定义点或声明点之后的函数内外,外部连接性
可以跨越文件使用
4、全局静态变量永久定义点或声明点之后的函数内外,内部链接性
不可以跨越文件使用
5、动态分配变量由程序员决定在分配后、回收前的任何地方外部链接性
注意,局部静态变量离开其作用域,就不可访问(或不可见),但是不表示它不存在即它的生存期并未结束,只是不可见而已。这类变量可以在其它函数内通过其指针访问。
全局静态变量的作用,使得各个文件可以定义自己私有的变量,而无需担心与其它文件中的变量重名
在同一作用域内,不能定义同名的变量
在不同作用域内,可以定义同名的变量
在有包含关系的作用域内,允许定义同名变量,并且内部作用域的同名变量会覆盖外部
作用域变量的作用域,即发生作用域覆盖。