一、存储类型

在定义一个数据(变量/数组)的时候,除了需要定义数据类型外,还需要定义存储类型。数据类型用于说明变量的长度和存储方式,而存储类型用于说明变量的使用规则

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语言:存储类型,内存管理相关推荐

  1. python终结一个循环额_Python语言入门之内存管理方式和垃圾回收算法解析

    本文主要向大家介绍了Python语言入门之内存管理方式和垃圾回收算法解析,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在列表,元组,实例,类,字典和函数中存在循环引用问题.有 ...

  2. C语言知识点 -- 动态内存管理、文件操作

    C语言知识点 – 动态内存管理.文件操作 文章目录 C语言知识点 -- 动态内存管理.文件操作 一.动态内存管理 1.malloc 2.free 3.calloc 4.realloc 二.文件操作 1 ...

  3. Linux内核在中国大发展的黄金十年-写于中国Linux存储、内存管理和文件系统峰会十周年之际...

    Linux阅码场: 国内首屈一指的专注Linux核心技术开发的公众号,扫描下方二维码关注 CLSF: CLSF是中国Linux存储.内存管理和文件系统峰会的简称, 至今已举办十年, 参会成员由组委会根 ...

  4. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  5. C语言与JAVA内存管理_深入理解C语言内存管理

    之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...

  6. C语言学习笔记 —— 内存管理

    一.内存模型 对于一个C语言程序而言,内存空间主要由五个部分组成 代码段(text).数据段(data).未初始化数据段(bss),堆(heap) 和 栈(stack) 组成,其中代码段,数据段和BS ...

  7. C语言 深度探究C语言中的内存管理

    C 语言的内存管理 简介 C 语言的内存管理,分成两部分.一部分是系统管理的,另一部分是用户手动管理的. 系统管理的内存,主要是函数内部的变量(局部变量).这部分变量在函数运行时进入内存,函数运行结束 ...

  8. Go 语言中手动内存管理

    2019独角兽企业重金招聘Python工程师标准>>> Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. ...

  9. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  10. C语言程序设计 | 动态内存管理:动态内存函数介绍,常见的动态内存错误,柔性数组

    动态内存管理目录: 动态内存函数的介绍 常见的动态内存函数的错误 柔性数组 为什么会有动态内存管理呢 我们在日常使用中,创建一个数组,一个变量时都会开辟空间 如: int a; //在栈上开辟一个四字 ...

最新文章

  1. 80486保护模式存储管理
  2. 【安全漏洞】利用CodeQL分析并挖掘Log4j漏洞
  3. SpringCloud教程- 服务消费者(rest+ribbon)(SpringCloud版本Finchley)
  4. 【文末福利】图论算法:稳定婚姻问题,如何找到最适合自己的另一半
  5. MUI组件:弹出层组件 - 案例篇
  6. 清空邮件队列中的邮件
  7. springboot 双缓存设计与使用
  8. KafKa基本入门教程
  9. python获取每月的最后一天_关于日期:使用Python获取本月的最后一天
  10. Nginx日志和http模块相关变量
  11. Android播放音频的两种方式
  12. CDN回源原理和CDN多级缓存
  13. 微信刷票python代码_微信刷票漏洞详解, Python脚本实现一秒破万!
  14. 【Java每日一题】Java笔试100题(1)
  15. vue3 源码分析-运行流程分析
  16. Android——单元测试
  17. 三、C语言常用的库函数
  18. supersu-v2.8.2.zip_术业有专攻:ZIP文件操作模块zipfile
  19. 戒不掉的温柔 (残月
  20. 集成学习(voting)

热门文章

  1. Spring--quartz中cronExpression配置说明
  2. hdu 3631 Shortest Path(Floyd)
  3. 解决GD中文乱码问题
  4. ZOJ3545——AC自动机+状态dp
  5. Java算法之两数之加
  6. 这9个Python问题你能回答几个?
  7. Python批量导入图片生成PowerPoint 2007+文件
  8. Python编程常见出错信息及原因分析(3)
  9. 基于Python的电子教室软件中远程关机功能的原理与实现
  10. vim 删除当前词_vim 可视话模式(即删除一列和多列)