动态内存管理之malloc函数

简介: 动态内存管理之malloc函数

引子:  

题外话:要学好1.指针,2.结构体,3.动态内存开辟,对于学习数据结构有帮助。

如今,我们在写代码的时候,会向电脑申请空间,而现在我们现在学过的申请空间的方式只有一个,一个是int(一小块一小块申请的),一个是int [ ](一大块一大块申请的)。

微信截图_20230911110045.png

不过,我们这种方法申请的空间是固定的,大小无法改变,不太方便。


在C语言中,我们有这个能力使我们所申请的内存大小可大可小,动态内存管理就是干这种事情的。其中在动态内存管理中最为核心的是malloc,calloc,ralloc,free。


接下来,我们来进行学习malloc函数。


在cplusplus.com中可以查到malloc函数的定义:


微信截图_20230911110211.png

进行查看后,使用malloc后,会开辟一个size大小的空间,返回一个指针指向内存块的起始位置。在申请空间的时候,会不会申请失败?在申请失败后,会返回一个空指针。如果size为0,malloc函数的行为标准是未定义的,取决于编译器。


free函数用来释放动态开辟的内存:1.如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的;2.如果参数ptr是NULL指针,则函数什么是都不做。


微信截图_20230911110225.png

微信截图_20230911110236.png

下面是编写代码进行使用malloc函数:

微信截图_20230911110321.png

介绍一下INT_MAX是什么?转到定义后是21亿多大。

微信截图_20230911110342.png

再来解释一下int申请的空间和malloc函数申请的空间在不同的区上:

微信截图_20230911110420.png

malloc函数对应有free函数,在进行内存申请后需要将申请的空间进行释放,从而不会造成内存泄漏(通俗说,你借了一本书,但你没有换,这样别人也看不了)。而上述的代码中没有free,并不是说内存空间就不回收,当程序退出的时候,系统会自动回收内存空间的。


free函数是用来释放申请空间的。在释放完空间后,p还指向malloc函数返回的地址,如果不将p指向空,则p会成为野指针。

微信截图_20230911110433.png

malloc和free尽量成对出现,防止内存泄漏。

现在在进行编写死循环申请空间,电脑不会无节制的给予空间,不会使电脑死机,如果有一个需要跑7乘24小时的程序中出现内存泄漏是很可怕的,需要过几天重启系统。

相关文章
|
3月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
45 3
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
69 6
|
3月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
3月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
3月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
523 1
|
3月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
46 0
|
3月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
52 0
|
3月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
95 0
|
3月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
91 0
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
428 1