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

C语言动态内存(c++动态分配内存数组)

  • 内存
  • 2024-05-30 18:31:04
  • 4037

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

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

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

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

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

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

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

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

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

一个数组的例子:

释放的时候需要注意,因为之后for循环执行完毕,p地址向前移动了10,所以需要减去10然后释放p,否则会有问题

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

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

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

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

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

(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可能没有空闲内存此时可用。(虽然这种情况一般不会发生)

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

不必释放在同样的功能中,发布在应用程序的任何角落都有效。

也就是说:这块内存被malloc后,就完全交给你处置了

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

参数:

参数:

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

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


二、c语言中什么是动态分配内存?C语言使用malloc函数来动态分配内存。指针用于释放内存。
malloc原型:externvoid*malloc(unsignedintnum_bytes);
用法:#include
或#include
功能:用于申请内存空间,并分配一块长度为num_bytes字节的内存
说明:如果分配成功,则返回指向已分配内存的指针,否则返回空指针NULL这是回。
如果不再使用该内存,则必须使用free()函数释放该内存块。
调用格式,
指针名称=(指针所指向对象的数据类型*)malloc(number*sizeof(指针所指向对象的数据类型))示例包括:像这样:
int*p=(int*)malloc(n*sizeof(int));
示例:
//malloc.c
#include
#include
main()
{
char*p;
clrscr();//clearscreen
p=(char*)malloc(100);
if(p)
printf("MemoryAllocationat:%x",p);
else
printf("NotEnoughMemory!\n");
if(p)
free(p);
getchar();
return0;
}