目录

为什么需要动态开辟内存空间?

1.malloc函数

2.free函数

3.calloc函数

4.realloc


为什么需要动态开辟内存空间?

我们已经熟悉了基本的内存开辟方法:

int a = 0;//向内存申请4个字节的空间
char b=0;//向内存申请了1个字节
int arr[10] = {0};//向内存申请了40个字节

我们创建需要的变量,以此向内存申请开辟对应的空间,不过上述的开辟空间方法有一定的局限性:它开辟空间后无法调整,内存大小无法更改,只能维持其有的空间大小。这时,C语言为我们创建了一组动态内存开辟的函数,接下来我们就认识一下吧。

1.malloc函数

(这里提及的函数的头文件均为<stdlib.h>)

我们可以看到这个函数的返回类型是void*类型,它向内存申请一块连续可用的空间,并返回指向这块空间的指针,切记,此时的指针类型是void*类型,它不指向任何确定的指针,所以我们想要保存这个返回值时需要强制类型转换成自己所需的类型。如果开辟失败,则会返回空指针NULL。

我们开辟了40个字节大小的空间,将它的地址强制类型转换成int*型放入指针变量p中,但malloc会有开辟失败的现象出现,比如:

系统也会自动提示我们内存开辟失败,当失败的时候我们如果继续访问则会失败,所以在使用malloc函数时,务必要进行开辟内存成功与否的检查。

在成功开辟后:

虽然申请了相应的四十个字节的空间,但我们也可以观察到,其分配的最初40个字节空间的值是随机值。然后我们将它们改写成0~9

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int main()
{int*p = (int*)malloc(40);if (p == NULL){return 1;}else {int i = 0;for (i = 0; i < 10; i++){*(p + i) = i;}for (i = 0; i < 10; i++){printf("%d ", *(p + i));}}return 0;
}

可以观察到是成功的改变了开辟的该40字节的空间,当我们使用完这个函数时候,由于它是动态内存的开辟,该函数开辟的内存空间均放置在堆区,堆区的特点就是:直到程序运行结束才会返回申请的内存空间,除非我们主动退还空间,不然空间会一直存在。

所以当我们不想用这块儿空间时,就需要我们自己主动释放空间——也就需要我们的free函数。

2.free函数

原型如下:

void* malloc (size_t size);

无返回类型,仅需要,要求返回空间的起始地址即可——该函数专门用来返回malloc开辟的动态内存空间,所以在使用完malloc函数后,我们只需主动返回空间即可,但我们会观察到如下结果出现:

我们会发现p中的值已经成了随机值,但p地址始终存在并未被销毁,也就是说我们还可以找到p这块儿空间。那当我们不小心释放后再次进行对p的访问就会非法访问,为了避免这样的情况出现,我们将p在释放后立即改成NULL即可。

即以此完整的malloc开辟内存空间并正确使用的代码就只需在上面的代码循环后加上:

free(p);
p = NULL;

即可进行一次正确的malloc函数的使用。

3.calloc函数

C语言还介绍了calloc的动态开辟内存的函数,原型如下:

void* calloc (size_t num, size_t size);

返回类型与malloc相同为void*型,有两个参数,该函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0,这是与malloc函数所不同的,当然,开辟空间失败时也会返回空指针NULL,所以使用时仍需要我们进行判断是否开辟成功,并且也需要使用完开辟的空间后需要进行主动释放空间和制为空指针。

由于malloc和calloc函数使用方法极其类似,我们在此就不多赘述,举例如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{int *ret = (int*)calloc(10, 4);if (ret == NULL){return 1;}else{int i = 0;for (i = 0; i < 10; i++){*(ret + i) = i;}free(ret);ret = NULL;}return  0;
}

我们可以看到开辟的空间会初始化为0,这是与malloc所不同的。

在将如下代码进行完后,我们可以看到开辟的40个字节的空间被赋值成如上结果,最后进行释放空间和空间空指针化即可。所以如果我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。

(小编提醒一下哦:malloc和calloc函数须要和free函数同时出现使用)

4.realloc

有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整,realloc函数的出现也让动态内存管理更加灵活。

函数原型如下:

void* realloc (void* ptr, size_t size);

ptr是要调整的内存地址
size是调整之后新大小
返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还有可能会将原来内存中的数据移动到新的空间

我们需要注意,在使用realloc函数调整内存空间时是有两种情况的:

①原有空间之后有足够大的空间,扩展内存只须在原有内存后直接追加即可

②原有空间之后没有足够的空间,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。

1,比如我们来观察第一种情况,代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{int *ret = (int*)malloc(10, 4);if (ret == NULL){return 1;}else{int *tmp = (int*)realloc(ret, 40);int i = 0;for (i = 0; i < 10; i++){*(tmp + i) = i;}free(tmp);tmp = NULL;}return  0;
}

在执行完malloc函数后,有如下开辟情况:

然后realloc函数执行:

再看地址情况:可以发现,我们只是追加,而tmp的地址与ret一样。

2,我们再来看看情况2:

再来看其地址情况,可以观察到我们是重新开辟的一大段内存空间来存储新的tmp地址

这便是小编认识的三个动态开辟内存空间的函数以及一个释放空间的函数,大概的认识也就如上所述,秉持着读者可以学到的心态来写出这篇文章的,也希望大家多多支持。

C语言——动态开辟内存空间的函数相关推荐

  1. C语言_malloc动态开辟内存空间

    malloc动态开辟内存空间 01--malloc动态开辟内存空间函数: 通常定义数组的时候就把内存地址定好了,比如: ind data[] = {1,2,3,4,5}; char cdata[6] ...

  2. C语言动态申请内存空间之malloc(),calloc(),realloc()函数

    在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...

  3. C语言 动态开辟内存管理

    动态内存管理 malloc(用得最多) calloc realloc 常见的动态内存错误 malloc(用得最多) 函数原型:void* malloc (size_t size);参数为要申请空间的大 ...

  4. [c语言]malloc动态开辟内存空间

    文章目录 一.malloc开辟空间,realloc增加空间内存 二.野指针 一.malloc开辟空间,realloc增加空间内存 //Test8.c #include<stdio.h> # ...

  5. C语言动态申请内存空间

    为什么要动态内存申请 1.定义数组的时候数组的长度是预先定义好的,在整个程序中固定不变; 2.但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定 3.为了解决 ...

  6. C语言学习笔记——(三)静态开辟内存和动态开辟内存

    注:编码工具是CLion+Cygwin64 目录 补充知识:C语言的布尔类型--非零即true. 静态开辟内存 静态开辟内存上限测试: 静态开辟内存特点: 静态开辟内存自动开辟和自动释放测试: 动态开 ...

  7. C语言动态开辟数组(一维与二维)【malloc() free()】

    了解并熟悉malloc(),calloc(),realloc(),free()等动态开辟函数. 重点使用malloc()与free()进行数组的动态开辟! 一.认识malloc().free() C+ ...

  8. c语言动态开辟数组(一维与二维)

    文章目录 前言 一.认识malloc()与free() 二.动态开辟一维数组 1.常见使用情况 2.动态创建数组 补充说明 三.动态开辟二维数组 1.使用创建一维数组的思想进行动态开辟 所申请空间的连 ...

  9. C++学习之路抓紧跑路版(七)-动态申请内存空间

    文章目录 前言 一.如何申请动态内存空间? 二.练习 总结 前言 今天我们来看下在C++中如何动态申请内存空间,不多比比 一.如何申请动态内存空间? 在C++中我们用new/delete来申请和释放内 ...

最新文章

  1. 介绍一个效率爆表的数据采集框架
  2. 异步fifo_异步FIFO设计
  3. ConcurrentHashMap 原理解析
  4. STL中算法锦集(四)
  5. 今天的编程语言是怎么来的?
  6. idea资源包下创建资源包_资源包技巧和最佳实践
  7. 乐观锁和悲观锁_什么是悲观锁和乐观锁?
  8. linux md5 加密字符串和文件方法
  9. java vector 线程安全_关于Vector到底是不是 线程安全的 问题
  10. html的字母u代表什么意思,html元素 u 标签的使用方法及作用
  11. 人生 第一页HTML
  12. 使用软件测试路由器性能报告,路由器软件测试报告.doc
  13. python网易云音乐下载器爬取全网音乐
  14. 禁止html5手机端双击页面放大的问题
  15. 时辰和属相、当令经的对应关系
  16. 无刷直流电机感应电动势为什么是梯形波?
  17. 微信小游戏如何突破4M限制
  18. 习题8-7 字符串排序 (20分)
  19. 【2022年对话机器人chatbot】SaleSmartly如何解决客服难题
  20. 小型机和服务器有何区别

热门文章

  1. 社工心理学:如何让LOL找你约架的社会人给你道歉
  2. 计算机在信息处理中的作品用,计算机信息处理技术在办公自动化中的运用
  3. openfoam前处理:并行计算decomposeParDict和setFieldsDict
  4. 手机使用电脑自带功能进行投屏
  5. DNS服务器未响应惊叹号,怎么办呢电脑连接网络出现感叹号?
  6. Quartus联合modelsim的ip核仿真——以FIFO为例——(报错问题解决)
  7. MAXIMO开发代码记录
  8. wince车机可以连接电脑吗_WINCE车机平台手机互联使用说明
  9. (poj 2377)Kruskal算法 最大生成树
  10. vivo系统升级服务器无响应,vivo系统升级教程