C语言什么时候应该动态分配内存?动态分配内存是什么意思?
当无法提前确定所需的内存量时,在运行时动态分配内存。
仅仅因为程序复杂需要释放就分配堆内存有什么意义呢?
释放多余的内存意味着将内存归还给系统管理,以防止内存使用过多,导致系统内存不足、速度变慢,甚至崩溃。
动态分配参数是指分配指定大小,还是具体指指定不超过数值的大小?
动态分配需要精确的内存分配,因此必须指定大小。
这是C语言线程问题吗?如果没有动态赋值,是否存在引用数据类型被注销的情况?绝对不是
使用局部变量时,如果超出范围,该变量就会无效或将您注销
需要一个数组来保存用户输入,但我们不知道用户会输入多少数据。
(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()要高
上一篇:c语言动态分配内存如何
下一篇:c语言动态分配内存