当前位置:首页 > 内存 > 正文

c中动态分配内存

  • 内存
  • 2024-08-18 17:05:24
  • 408

一、【C语言】动态内存的分配

当你第一次学习C语言时,你是否想过如何给数组分配合适的空间?本文将深入探讨动态内存分配,帮助您了解内存管理的奥秘。


动态内存分配与静态内存不同。后者是预定义的数组大小并固定在堆栈区域中,而动态内存允许您在运行时控制内存大小。这种类型的堆分配内存提供了更大的灵活性。


动态内存优点:
动态内存允许您根据需要动态调整大小,避免空间浪费或不足的问题。例如,在地址簿应用程序中,空间可以随着用户添加号码而动态扩展。
动态内存分配的空间在函数结束时由用户主动释放,可以重复使用,进一步节省空间。例如,可以在发布后寻求再次使用。
与栈区相比,动态内存不占用栈区的内存。尤其是当需要较大的连续空间时,对于桩区的应用更为实用。


动态内存管理涉及函数“malloc”、“calloc”和“realloc”。'malloc'和'calloc'用于请求内存。前者返回未初始化的内存,后者初始化为零。'realloc'用于调整分配内存的大小。您必须注意分机操作期间可能发生的地址更改。


在具体实现中,比如为单个对象或数组分配空间,动态内存分配方式虽然看似复杂,但实际上“calloc”和“malloc”是一样的,并且主要区别在于第一个参数的处理和类型转换。


一般来说,动态内存分配和管理为程序提供了更大的灵活性,但也要求开发者更加谨慎地处理内存分配和释放,以避免内存泄漏和其他相关问题。


二、C语言-动态分配内存malloc&free

我需要一个数组来存储用户的输入,但我不知道用户会输入多少数据。

(1)数组设置太大,会浪费内存
(2)设置太小,不够用

问题:如何既足够又不浪费?

系统有一个内存管理器(MM,MemoryManager)来管理空闲内存束。它就是为了解决这些问题而设计的。

MM提供的服务:应用程序可以向MM请求(租用)指定大小的内存,使用后释放(归还)。

如果您的应用程序使用malloc,则必须将返回值转换为目标类型。

这个内存和数组没有本质区别,它们的用法是完全一样的。

首先您需要计算需要多少字节的内存空间。

数组的示例:

释放时要小心。for循环运行,由于p的地址已经向前移动了10,所以我们需要减去10,然后释放p。否则会遇到问题。

//销毁时只需要释放一次即可。分配几个字节后,您可以释放它们,无论它们是char还是int类型。
free(p);

函数中动态分配的内存会在其他内存上运行。作品。功能

(1)MM是系统级的,所有应用程序都使用相同的MM内存。

(2)什么是贷款?事实上,当你借出内存时,MM会对它管理的内存进行标记,以表明该内存已经被使用。例如记录每段占用的内存(首地址、长度):
(p0,n0)(p1,n1)(p2,n2)...

(3)MM为非常慷慨:①只要别人提出要求,他就会答应借给别人。②如果你不还给我,我绝不会无偿索要。

(4)MM管理的内存区域称为“堆”堆。

这意味着用户程序必须及时感到空闲,以免耽误使用其他记忆的意思。应用。如果您的应用程序继续进行malloc而不释放,则MM最终将耗尽内存。如果MM中没有更多可用内存,则malloc返回NULL,表明内存已用完。

再次强调,malloc后应尽快释放申请!

使用规则:需要时重新申请,不需要时立即释放。

实际上,MM识别租用的内存块
(p0,n0)(p1,n1)(p2,n2)...
两个内存块都是“我们内部确保“不重复”。”“这意味着没有重叠,并且您不会同时将一块内存借给两个应用程序。

所以每个内存块的首地址都是不同的。释放时只需指定首地址即可。

对象引用的一块内存

示例:用Citizen代表公民,或者用Car代表汽车。他一开始可能没有汽车,但最终他会有一辆。

什么是“及时”?如果“时机不对”怎么办?

MM中的可用内存是有限的。因为其他应用程序也需要MM内存,所以用完后必须立即归还。

您只借不还。经过一些积累后,malloc返回NULL,因为MM中没有更多可用内存。

要还款,必须全额还款,否则MM无法处理。

原因是MM可能没有空闲内存。目前可用。(虽然这通常不会发生)

释放后,内存返回给MM,并且该内存不再可用(无效)

无需释放它。在相同的功能中,发布对应​​用程序的所有部分都有效。

也就是说,这块内存一旦分配完毕,就完全由用户支配。

功能:将s当前位置后面的n个字节(typedefunsignedintsize_t)替换为ch。并返回s。

参数:

参数:

功能:将src指向的内存区域中的n个字节移动到dest指向的内存区域。复制。

memmove()函数与memcpy()相同。不同的是,当dest
和src指向的内存空间重叠时,memmove()可以处理这种情况,但执行效率低于memcpy()


三、C语言(4)-内存管理内存管理详解

在C语言中,内存管理主要分为两个部分:堆和栈,各有其特点和使用方法。


1.堆内存管理

堆内存就像计算机剩余的空闲空间一样,是通过malloc函数获得的。当您需要更多内存时,系统会自动分配一个区域并返回指向该区域的指针。使用完后,记得通过free函数将内存归还给操作系统,避免内存泄漏。例如,Database_open用于分配内存,Database_close用于释放内存。


2.堆栈内存管理

堆栈内存更加特殊。它在函数调用时存储局部变量,类似于函数的临时存储区。栈的运行原理和真实的栈类似,后进先出。当函数结束时,堆栈会自动清理局部变量,以避免内存泄漏。比如main函数中的局部变量。


原则和区别

确定内存区域的主要规则是:不是由malloc分配的变量通常驻留在堆栈上。因此,了解何时在堆栈上分配以及何时在堆上分配是有效内存管理的关键。


3.常用操作
malloc:动态内存分配,比如为int分配空间。
free:释放之前由malloc分配的内存。
calloc:预初始化内存并连续分配空间。
realloc:重新分配内存大小。
4.内存布局

程序的内存布局包括代码段(存储的可执行代码)、BSS段(未初始化的全局变量)、堆和堆栈。堆是由程序员动管理的,增长方向是从低地址到高地址,而栈是自动管理的,从高地址到低地址。


堆和栈的比较

堆和栈的显着区别在于分配方式(手动/自动)、存储时间(是跨功能/本地共享)以及方向演化(上/下)。


正确理解和使用这些内存管理概念可以帮助您编写更强大、更高效的C程序。