前面中我们了解到:

int n;

int arr[n];

这样定义数组是不可取的,不能用此方法给数组分配动态内存,那怎么样才能实现这种可能呢?

接下来我将关于动态内存的知识做以下总结。

有关动态内存的函数有四个,分别是malloc( )、calloc( )、free( )、realloc( )。ansi(美国国家标准协会)标准建议应添加头文件#include ,但许多c编译要求用#include 头文件,在使用时应注意。

ansi标准要求动态分配系统返回void指针。void指针具有一般性,它们可以指向任何类型的数据。所以有时需要用到强制类型转换的方法把void指针转化为所需的类型。

一、动态内存函数

(一)malloc函数

功能:申请动态内存,分配size字节的存储区

所需参数:一个参数size,表示所分配的字节

形如:int *p = (int *)malloc(n*sizeof(int));

返回值:所分配的内存区起始地址,如内存不够,返回0

(二)calloc函数

功能:分配n个数据项的内存连续空间,每个数据项的大小为size

所需参数:两个参数

形如:int *p = (int *)calloc(n,sizeof(int));

用malloc函数表示如下:

int main()

{

int n = 10;

/* int *p = (int *)malloc(n*sizeof(int));

for(int i=0;i<10;i++)

{

p[i] = 0;

} */ //等同calloc

//int *p = (int *)calloc(n,sizeof(int));//0

返回值:分配内存单元的起始地址,如不成功,返回0

malloc函数与calloc函数的区别:

malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0。

(三)free函数

功能:释放p所指的内存区

所需参数:一个参数

形如:free(p); // 释放内存,与malloc配合使用

返回值:无

(四)realloc函数

功能:将p所指出的已分配内存区的大小改为size,size可以比原来分配的空间大,即扩容

所需参数:两个参数,新的大小,以字节为单位

int n = 10;

int *p = (int *)malloc(n*sizeof(int));

int i;

for(i=0;i<10;i++) //模拟p已经被使用

{

p[i] = i*i + i;

}

将以上10 个内存扩大为20个内存,如下:

int n = 20;

int *q = (int *)malloc(20*sizeof(int));

for(i=0;i<10;i++)

{

q[i] = p[i];

}

free(p);

p = q;

q = null; // 把q注销掉,若无此句,则崩溃

//上面的代码等同于realloc

等同于:p = (int *)realloc(p,80);

一般情况下,操作系统会忽略缩小内存的要求,操作系统会缓存刚刚保存的数据,提高代码的利用率和运行速度。

动态内存存储里,不讨论堆中谁的内存大谁的内处小,不能确定地址的大小规律,有存储空间就有可能保存新数据。

二、free( )崩溃的原因

动态里每个块前有个头,每个块后有个尾。(边界标识法)

头:开启

尾:合并(胶水的作用),可以把小块拼成大块

1、越界(修改了尾信息)

2、指针移动(如*p = 0;p++)

3、重复释放(free至少两次)

4、释放栈内存(数组不能释放,堆却可以,栈内存操作系统会自动回收)

四、堆与栈的区别:

栈:一使用就会释放内存,1m

堆:申请的内存大,但不会主动释放,容易发生内存泄漏。

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

五、动态内存最严重的问题就是:内存泄漏,还有数组越界。

c语言的四个函数,C语言学习之动态内存分配的四个函数相关推荐

  1. C语言学习笔记---动态内存分配

      数组在内存中时存储在连续的位置上,当声明一个数组的时候,编译器就会在内存中分配它所需要的空间,但是有时候还需要使用动态内存为数组分配空间.   比如现在要同统计一个班级学生的成绩,可以申请一个固定 ...

  2. C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)

    1.问题 编写calloc函数,函数内部使用malloc函数来获取内存               2.代码实现 #include <stdio.h> #include <stdli ...

  3. 【C语言】动态内存分配

    [C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...

  4. 浅谈C语言动态内存分配及柔性数组

    文章目录 前言 1.动态内存的简单介绍 1.动态内存分配是什么? 2.为什么存在动态内存分配? 3.动态内存分配具体方法 1.动态内存函数 2.动态内存注意事项 2.经典面试题分析 3.C/C++程序 ...

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

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

  6. C语言通过函数参数不能带出动态内存的例子。

    实验结论:通过函数参数不能带出动态内存,函数参数虽然为指针,其实是在函数内部的临时变量,只是该指针的初始值是通过调用函数赋值的.C语言函数参数都是传值的. #include <stdio.h&g ...

  7. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

  8. C语言动态内存管理和动态内存分配函数

    给变量分配内存空间可分为静态内存分配和动态内存分配. 静态内存分配属于编译时给变量分配的空间,动态分配属于在程序运行时给变量分配的空间 静态分配属于栈分配,动态分配属于堆分配 运行效率上,静态内存比动 ...

  9. C语言动态内存分配函数

    目录 1.malloc() 2.free() 3.calloc() 4.realloc() 5.小结 在C中我们开辟内存空间有两种方式 : 1.静态开辟内存 : 例如: int a; int b[10 ...

最新文章

  1. MySQL之pymysql模块
  2. AI一分钟|苹果无人车可根据乘客情绪调整行车方式;快商通完成近亿元融资
  3. C语言 · 身份证号码升级
  4. 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的
  5. Android中的一些基础知识(二)
  6. mysql主动自增可以_Mysql join联表及id自增实例解析
  7. axios介绍---axios工作笔记001
  8. 爱数助力国资委实现混合IT环境下的业务保护
  9. 【渝粤教育】国家开放大学2018年春季 8662-22T特色课(1) 参考试题
  10. 用于编译cm-12.0 的 local_manifest.xml文件
  11. 数据结构(C语言)基础入门
  12. 获取键盘上某键的状态
  13. 数据处理—ArcGIS处理地理空间数据云30mDEM数据
  14. matlab乘除号怎么打,matlab中的乘除法
  15. mysql 转大写_mysql将字符串转换为大写的方法
  16. 团建游戏------走迷宫
  17. 系统找不到指定的文件
  18. 什么是DNS污染?DNS污染的解决方法
  19. 初学者须知 常见Web前端开发工具有哪些
  20. Unity TileMap 2D 工具基础教程

热门文章

  1. 了解如何使用ASP.NET Core 3.1构建Web应用程序
  2. u8薪资管理_用友U8习题集
  3. 用idea给java项目打jar包
  4. makfile 用法
  5. Vue——基础(对象、属性样式操作、条件、循环、事件、绑定)
  6. Python random模块常用方法的使用
  7. C# 可空类型和空接合运算符(??)
  8. 《Pytorch - 线性回归模型》
  9. 3d页游开发_大翅膀等于页游风?天谕手游扭转印象,阿云嘎同款黑翅膀最有排面...
  10. kettle分批处理大表数据_采用Kettle分页处理大数据量抽取任务