C语言:存储类型,内存管理
一、存储类型
在定义一个数据(变量/数组)的时候,除了需要定义数据类型外,还需要定义存储类型。数据类型用于说明变量的长度和存储方式,而存储类型用于说明变量的使用规则
1.存储类型的分类
<1> 自动存储类型
<2> 寄存器存储类型
<3> 全局非static静态存储类型
<4> 全局static静态存储类型
<5> 局部static静态存储类型
<6> 外部存储类型
2.如何定义不同存储类型的变量
定义一种存储类型的变量,需要两个条件:定义位置和定义的形式
存储类型 | 定义位置 | 定义形式 |
---|---|---|
1.自动存储类型 | 代码块内 | int a; |
2.寄存器存储类型 | 代码块内 | register int a; |
3.全局非static静态存储类型 | 代码块外 | int a; |
4.全局static静态存储类型 | 代码块外 | static int a; |
5.局部static静态存储类型 | 代码块内 | static int a; |
6.外部存储类型 | 代码块外 | extern int a; |
3.不同存储类型变量的使用
存储类型 | 在内存中的位置 | 生存期 | 作用域(在程序中使用的区域) |
---|---|---|---|
1.自动存储类型 | 栈 | 定义–>代码块结束 | 代码块 |
2.寄存器存储类型 | 寄存器/栈 | 定义–>代码块结束 | 代码块 |
3.全局非static静态存储类型 | .data/.bss | 定义–>程序结束 | 多文件 |
4.全局static静态存储类型 | .data/.bss | 定义–>程序结束 | 单文件 |
5.局部static静态存储类型 | .data/.bss | 定义–>程序结束 | 代码块 |
6.外部存储类型 | .data/.bss | 定义–>程序结束 | 多文件 |
二、内存管理-----//堆空间申请和释放
堆和栈的区别
栈:
① 有名空间,可以通过空间的名称访问空间中的数据
② 空间比较小
③分配和释放由系统自动完成,对于程序员来说,不可控制
④ 执行效率较高
堆:
① 无名空间,只能通过指针访问堆空间
② 空间较大
③ 分配和释放由程序员完成,所有可以在程序中灵活的控制空间的生存期
④ 执行效率较低
1.申请堆中的空间——malloc()
#include <stdio.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",p[i]);printf("\n");return 0;
}
2.释放堆空间——free()
#include <stdio.h>
void free(void *ptr);
//参数-----ptr:malloc 返回的地址
//注意:
①不能重复释放同一块空间
②不能释放申请的空间的一部分
③不能给free传NULL,没有意义
例如:
#include <stdio.h>
#include <stdlib.h>int main(void)
{int* p;p = (int*)malloc(5*sizeof(int));if(p == NULL){perror("malloc"); //打印某个函数出错的信息exit(1); //结束当前程序} *p = 123;printf("*p = %d\n",*p);//p = p+1; //不能释放申请的空间中的一部分free(p);//free(p); //不能重复释放同一块内存空间free(NULL); //没有意义return 0;
}
//另外两个申请堆空间的函数----不太常用
void *calloc(size_t nmemb, size_t size); //与malloc类似,申请对空间
//参数1 ----- nmemb:申请的数据的个数
//参数2 ----- size: 申请的数据的大小
//返回值----与malloc相同
例如: 在堆中申请有5个元素的int型的数组空间
int p;
p = (int)calloc(5,sizeof(int));
void *realloc(void *ptr, size_t size); //堆已申请的堆空间进行大小进行修改(扩展)
//参数1 ------要修改的对空间的起始地址
//参数2 ------修改之后的堆空间的总大小
//返回值 -----成功:修改后的空间的起始地址,失败:NULL
比如:使用malloc申请了20个字节的空间,发现不够用,此时,可以使用realloc()堆空间进行扩展
int p;
p = (int)malloc(5*sizeof(int)); //申请20个字节的空间
for(i = 0; i < 5; i++)
p[i] = i+1;
//堆上面申请的空间进行扩展
p = (int*)realloc(p,10*sizeof(int)); //扩展为40个字节的空间
C语言:存储类型,内存管理相关推荐
- python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析
本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...
- C语言知识点 -- 动态内存管理、文件操作
C语言知识点 – 动态内存管理.文件操作 文章目录 C语言知识点 -- 动态内存管理.文件操作 一.动态内存管理 1.malloc 2.free 3.calloc 4.realloc 二.文件操作 1 ...
- Linux内核在中国大发展的黄金十年-写于中国Linux存储、内存管理和文件系统峰会十周年之际...
Linux阅码场: 国内首屈一指的专注Linux核心技术开发的公众号,扫描下方二维码关注 CLSF: CLSF是中国Linux存储.内存管理和文件系统峰会的简称, 至今已举办十年, 参会成员由组委会根 ...
- c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等
关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...
- C语言与JAVA内存管理_深入理解C语言内存管理
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...
- C语言学习笔记 —— 内存管理
一.内存模型 对于一个C语言程序而言,内存空间主要由五个部分组成 代码段(text).数据段(data).未初始化数据段(bss),堆(heap) 和 栈(stack) 组成,其中代码段,数据段和BS ...
- C语言 深度探究C语言中的内存管理
C 语言的内存管理 简介 C 语言的内存管理,分成两部分.一部分是系统管理的,另一部分是用户手动管理的. 系统管理的内存,主要是函数内部的变量(局部变量).这部分变量在函数运行时进入内存,函数运行结束 ...
- Go 语言中手动内存管理
2019独角兽企业重金招聘Python工程师标准>>> Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. ...
- C语言之动态内存管理与动态内存函数
文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...
- C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组
动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...
最新文章
- 80486保护模式存储管理
- 【安全漏洞】利用CodeQL分析并挖掘Log4j漏洞
- SpringCloud教程- 服务消费者(rest+ribbon)(SpringCloud版本Finchley)
- 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
- MUI组件:弹出层组件 - 案例篇
- 清空邮件队列中的邮件
- springboot 双缓存设计与使用
- KafKa基本入门教程
- python获取每月的最后一天_关于日期:使用Python获取本月的最后一天
- Nginx日志和http模块相关变量
- Android播放音频的两种方式
- CDN回源原理和CDN多级缓存
- 微信刷票python代码_微信刷票漏洞详解, Python脚本实现一秒破万!
- 【Java每日一题】Java笔试100题(1)
- vue3 源码分析-运行流程分析
- Android——单元测试
- 三、C语言常用的库函数
- supersu-v2.8.2.zip_术业有专攻:ZIP文件操作模块zipfile
- 戒不掉的温柔 (残月
- 集成学习(voting)