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

c语言动态内存(c语言申请动态内存)

  • 内存
  • 2024-08-01 12:33:04
  • 6168

一、C语言中的动态内存分配的用法举例

函数:其功能是在内存的动态存储中分配一块长度为size的连续区域。参数是无符号整数,返回值是指向分配的连续存储的起始地址的指针。

2.免费特性:内存空间总是有限的,所以不能无限制地分配,而且程序需要节省资源,所以如果分配的内存空间没有被使用就必须释放。因此,它被用在其他变量或程序中。这次我们将使用免费功能。

函数:它的作用是在内存的动态存储区域中分配n个连续的长度为size的空间。该函数返回一个指向已分配空间开头的指针,如果分配失败则返回NULL。

扩展信息:

函数运算符:

运算符new用于向系统请求动态存储空间,其使用格式如下:

指针变量=新数据类型。例:

int*p=newint

该语句的作用是使用new从内存中申请一个int变量(4字节),并将其首地址设置为赋值。给出变量指针变量p。

用new创建的变量初始值可以是任意的,也可以在用new分配内存的同时进行初始化。使用格式为:

指针变量=新数据类型(初始值)。

删除

堆内存可以根据需要分配。程序内存要求可能随时发生变化。需要new分配的空间,但是程序还没有执行完。以前占用的内存空间必须释放到堆内存并重新分配以供程序的其他部分以后使用。delete运算符用于释放new分配的内存空间并删除创建的对象。

删除指针变量。

指针变量保存新的赋值。内存的起始地址。

参考资料:-动态内存分配


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

需要一个表来记录用户输入,但我们不知道用户会输入多少数据。

(1)如果定义的数组太大,会浪费内存。
(2)如果定义太小,又不够用。

问:怎么办?够用了,但一点也不浪费?

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

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

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

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

首先需要计算所需内存空间的字节数

示例表:

释放时需要小心,因为在for之后循环执行完毕,p地址前进了10,所以需要先减10再释放p,否则会有问题

//销毁时,不需要只释放一次。malloc几个字节后,会释放其中的一些,无论char类型还是int类型
free(p);

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

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

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

(3)MM很慷慨:①只要有人分配,就同意借出。②如果你不归还,他们绝不会无偿向你要。

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

这意味着用户程序必须及时感到空闲,才能不耽误其他内存的使用应用程序。如果有一个应用程序不断进行内存分配而不是释放自身,它最终会耗尽MM中的内存。当MM用完空闲内存时,malloc返回NULL,表明内存已耗尽。

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

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

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

这样,释放时每块内存的首地址都是不同的,你只需要指定第一个地址

对象引用的一块内存

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

什么才算是“权宜之计”?如果“不及时”会发生什么?

MM中的可用内存是什么?当你使用它的时候,你需要尽快归还它,其他应用程序也需要MM的内存。

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

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

一旦释放,内存返回给MM,该内存就不再可用了(无效)

也不是不需要释放同一功能中,该版本在应用程序的任何角落都有效。

也就是说:一旦这块内存被错误分配,它就完全由你支配

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

参数:

参数:

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

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