8、内存映像&内存管理&存储类型
静态的意思是该变量在内存中原地不动。
8.1、存储类型
自动存储类型
寄存器存储类型
全局非static静态存储类型
全局static静态存储类型
局部static静态存储类型
外部存储类型
8.1.1、作用域
块作用域
定义在块中的变量具有块作用域。
函数作用域
即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数。
函数原型作用域
从形参定义处到原型声明结束。
文件作用域(也称全局变量)
从它的定义处到该定义所在文件的末尾可见。
8.1.2、链接
外部链接
内部链接
无链接
具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。
具有文件作用域的变量可以是外部链接或内部链接。
8.1.3、存储期
静态存储期
在程序执行期间一直存在。
线程存储期
从声明时到线程结束一直存在。
自动存储期
动态分配存储期
存储类别 | 存储期 | 作用域 | 链接 | 声明方式 |
---|---|---|---|---|
自动 | 自动 | 块 | 无 | 块内 |
寄存器 | 自动 | 块 | 无 | 块内,使用关键字register |
静态外部链接 | 静态 | 文件 | 外部 | 所有函数外 |
静态内部链接 | 静态 | 文化 | 内部 | 所以函数外,使用关键字static |
静态无链接 | 静态 | 块 | 无 | 块内,使用关键字static |
8.2、内存映像
在运行一个程序时,计算机会给当前的程序映射一个4GB大小的虚拟内存空间,程序在这样的一个虚拟内存中运行,这个虚拟内存称为内存的映像。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rkwEkZN-1618146266417)(pic/内存映射.png)]
8.3、内存管理(堆空间的申请和释放)
//堆和栈的区别
栈:
1》有名空间,可以通过空间的名称访问空间中的数据
2》空间比较小
3》分配和释放由系统自动完成,对于程序员来说,不可控制。
4》执行效率较高
堆:
1》无名空间,只能通过指针访问堆空间
2》空间较大
3》分配和释放由程序员完成,所有可以在程序中灵活的控制空间的生存期
4》执行效率较低
8.3.1、申请堆中的空间——malloc()
#include <stdlib.h>
void *malloc(size_t size);
//参数-----size:要申请的空间大小
//返回值-----成功:申请的空间的地址,失败:返回:NULL
//注意:
申请的空间是连续的
申请的空间没有初始化
malloc返回值的地址必须要强制类型转换
需要判断返回值是否可以使用
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p;
int i;
p = (int*)malloc(5*sizeof(int));
if(p == NULL){
perror("malloc"); //打印某个函数出错的信息
exit(1); //结束当前程序
}
for(i = 0; i < 5 ;i++)
*(p+i) = i+1;
for(i = 0; i < 5 ;i++)
printf("%d\t"