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

c语言动态分布内存是什么

  • 内存
  • 2024-08-16 07:06:55
  • 7823

一、c语言什么时候需要动态分配内存?

C语言什么时候应该动态分配内存?动态分配内存是什么意思?

当无法提前确定所需的内存量时,在运行时动态分配内存。

仅仅因为程序复杂需要释放就分配堆内存有什么意义呢?

释放多余的内存意味着将内存归还给系统管理,以防止内存使用过多,导致系统内存不足、速度变慢,甚至崩溃。

动态分配参数是指分配指定大小,还是具体指指定不超过数值的大小?

动态分配需要精确的内存分配,因此必须指定大小。

这是C语言线程问题吗?如果没有动态赋值,是否存在引用数据类型被注销的情况?绝对不是

使用局部变量时,如果超出范围,该变量就会无效或将您注销


二、什么是静态存储区和动态存储区啊?根据变量的生命周期,有两种类型:动态存储和静态存储。动态存储在调用函数时临时分配单元,而静态存储在程序的整个持续时间内都存在。
动态存储
形式参数(本函数内有效)
自动变量(本函数内有效)

register注册变量(本函数有效)
静态存储
静态局部变量(本函数有效)
静态外部变量(this文件有效)
三、C语言-动态分配内存malloc&free

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

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

问题:如何做到足够,但又不浪费?

系统中有一个内存管理器(MM,MemoryManager),它负责管理大量不活动的内存。它就是为了解决此类问题而设计的。

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

当应用程序使用malloc时,必须将返回值转换为目标类型。

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

你首先要计算一下需要多少字节的内存空间

一个数组的例子:

释放的时候一定要小心,因为for执行循环后,p地址向前移动了10,所以必须减去10然后释放p,否则会有问题

//销毁时只需释放一次即可。分配一些字节后,您将释放其中一些,无论是char类型还是int类型
free(p);

在一个函数中动态分配的内存,该内存在另一个函数中使用。function

(1)MM是系统级的东西,所有的应用程序都申请同一个MM的内存。

(2)什么是贷款?事实上,当内存被借出时,MM只是简单地标记它所管理的内存,表明该内存已被占用。比如记录每个占用的内存段(首地址、长度)
(p0,n0)(p1,n1)(p2,n2)...

(3)MM很大方:①只要有人弄坏了,他就同意借出。②如果你不归还,他绝不会免费向你索要。

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

这意味着用户程序必须及时感到空闲,以免耽误其他应用程序的使用。如果有一个应用程序不断进行malloc而不是释放自己,它最终将耗尽MM内存。当MM没有更多的空闲内存时,malloc返回NULL,表明内存已经耗尽。

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

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

目前,MM识别借用的内存块
(p0,n0)(p1,n1)(p2,n2)...
其内部已经保证任意两个内存块不会“重叠”“,即不会有重叠,并且不会有任何内存部分同时借给两个应用程序。

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

对象引用的一块内存

示例:用Citizen代表公民,用Car代表汽车。他一开始没有车,但将来他可能会有车。

什么才算“及时”?如果“不及时”会发生什么?

MM中的可用内存是有限的,当内存用完时,需要尽快归还,因为其他应用程序也需要MM的内存。

只借不归,积累到一定程度后,MM已经没有更多的可用内存了,所以malloc返回NULL。

如果要退款,必须全额退回,否则MM无法处理

原因是:MM此时可能没有可用内存时间。(虽然一般不会出现这种情况)

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

不需要释放在相同的功能中,释放在应用程序的任何角落都有效。

换句话说:这块内存被malloc后,就完全由你支配了

功能:将s中当前位置之后的n个字节(typedefunsignedintsize_t)替换为第3章Ereturns

参数:

参数:

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

memmove()函数与memcpy()相同,不同的是:当dest
和src指示的内存空间重叠时,memmove()仍然可以处理,但是执行。效率比较低的memcpy()要高