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

C语言动态内存申请

  • 内存
  • 2024-08-17 07:30:13
  • 8070

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

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

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

问题:如何做到刚好够用但又不浪费?

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

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

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

这个内存和数组没有太大的区别,而且它们的用法是完全一样的。

你必须先计算出需要多少字节的内存空间

一个数组的例子:

释放时你必须小心,因为在预分配之后循环执行时,p地址向前移动了10,所以必须减去10再释放p,否则会出现问题

//销毁时,只需释放一次即可。释放几个字节后,就会释放几个字节,无论char类型还是int类型
free(p);

在一个函数中动态分配的内存,在另一个函数中操作这块内存。function

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

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

(3)MM为非常大方:①只要有人分配,它就同意借出;②如果你不归还,它绝不会无偿向你索要。

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

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

再次强调:malloc后,应用应该尽快释放!

使用原则:需要时再查找,不需要时立即释放

实际上,MM识别借用的内存块
(p0,n0)(p1,n1)(p2,n2)...
它内部保证了任意两个内存块不会“重叠””,即不会出现重叠,一块内存不会同时借给两个应用程序。

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

对象引用的内存

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

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

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

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

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

原因是:MM可能没有免费的此时内存可用。(虽然这种情况一般不会发生)

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

不需要释放在同一个函数中,释放在应用程序的各个角落都有效。

也就是说:这块内存放错位置后,就完全由你支配了

功能:将s中当前位置之后的n个字节(typedefunsignedintsize_t)替换为ch并且returns

参数:

参数:

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

memmove()函数与memcpy()相同,区别在于:当dest
指向的内存位置与src重叠时,memmove()仍然可以处理,但是执行)。效率比memcpy()低


二、C语言,realloc动态内存申请,出现报错doublefreeorcorruption(!prev)

此错误消息:doublefreeorcorruption(!prev),多次释放或数据已损坏。

阅读你的代码后,我没有看到很多明显的解决方案,但我没有看到你输出结果的部分。

有时甚至会检测到一个字节越界并显示此警告。您可以仔细标记输出部分中的代码,或者首先注释掉输出部分并将其运行到狭窄的目标。

while(counter!=height-1

//此处赋值越界,导致发布时获取错误信息。设置崩溃;

tom后设置内存为matrix[0]、matrix[1];
tom传递该term并销毁一个或多个记录内存信息的matrix[N]