您的位置:

c语言动态内存开辟malloc,动态分配内存c语言

本文目录一览:

c语言中malloc是什么?怎么用?

malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size);

说明:

【参数说明】

size 为需要分配的内存空间的大小,以字节(Byte)计。

【函数说明】

malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。

【返回值】

分配成功返回指向该内存的地址,失败则返回 NULL。

操作:

由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。

如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型是 void *,void 并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用 malloc() 时通常需要进行强制类型转换,将 void 指针转换成我们希望的类型,例如:

#includestdlib.h

typedef int ListData;

ListData *data;  //存储空间基址

data = ( ListData * ) malloc( 100 * sizeof ( ListData ) );

扩展资料

实现malloc的方法:

(1)数据结构

首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。

数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。

(2)寻找合适的block

现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:

First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块

Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块

两种方式各有千秋,best fit有较高的内存使用率(payload较高),而first fit具有较高的运行效率。这里我们采用first fit算法。

(3)开辟新的block 

如果现有block都不能满足size的要求,则需要在链表最后开辟一个新的block。

(4)分裂block 

First fit有一个比较致命的缺点,就是可能会让更小的size占据很大的一块block,此时,为了提高payload,应该在剩余数据区足够大的情况下,将其分裂为一个新的block。

(5)malloc的实现

有了上面的代码,我们就可以实现一个简单的malloc.注意首先我们要定义个block链表的头first_block,初始化为NULL;另外,我们需要剩余空间至少有BLOCK_SIZE+8才执行分裂操作

由于我们需要malloc分配的数据区是按8字节对齐,所以size不为8的倍数时,我们需要将size调整为大于size的最小的8的倍数。

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

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

(1) 如果设一个太大的数组,则显得浪费内存

(2) 如果设得太小,又怕不够

问题:如何做到恰好够用、又一点不浪费呢?

系统中存在一个内存管理器(MM, Memory Manager),它负责管理一堆闲置内存。它被设计用于解决此类问题。

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

应用程序在使用malloc时,要把返回值转换成目标类型。

这块内存和数组没有本质区别,用法完全相同。

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

数组举例子:

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

// 当销毁时只需要free一次,malloc了几个字节就会free几个字节,和char类型还是int类型无关

free(p);

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

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

(2) 何为借出?实际上,在内存被借出时,MM只是把它管理的内存标记了一下,表示该段内存已经被占用。比如,它把每一段被占用的内存给记录下来(首地址,长度)

(p0,n0) (p1, n1) (p2, n2) ...

(3) MM非常慷慨:①只要有人 malloc ,它都同意借出 ②你不归还,它永远不会主动要求你 free 。

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

这意味着,用户程序应该自觉得及时 free ,以便不耽误别的应用程序的使用。如果有个应用程序不停地 malloc ,而不 free ,那最终会用光MM的内存。当MM没有更多闲置内存时, malloc 返回 NULL ,表示内存已经用完。

再次重申: 应用程序在malloc之后,应该尽早free !

使用原则:需要的时候再申请,不需要的时候立即释放

实际上,MM对借出的内存块进行标识

(p0, n0) (p1, n1) (p2, n2) ...

它内部已经保证任意两块内存不会“交叠”,即不会重叠,不会把一块内存同时借给两个应用程序使用。

所以,每块内存的首地址都是不同的,在 free 的时候只需要指明首地址即可。

对象指的一块内存

示例:用Citizen表示一个市民,用Car表示一个辆车。他起初没有车,但未来可能有一辆车。

怎么样才算“及时”? “不及时”会怎样?

MM里可用的内存是有限的,你用完了就得尽快还,因为别的应用程序也需要MM的内存。

只借不还,积累到一定程度,MM没有更多内存可用,于是malloc返回NULL。

要还就得全还,否则MM那边处理不了

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

free之后,该内存交还给MM,该内存不再可用(失效)

不一定要在相同的函数里释放,在应用程序的任意一个角落释放都是有效的。

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

功能:将 s 中当前位置后面的 n 个字节 (typedef unsigned int size_t )用 ch 替换并返回 s

参数:

参数:

功能:由 src 所指内存区域复制 n 个字节到 dest 所指内存区域。

memmove() 功能用法和 memcpy()) 一样,区别在于: dest

和 src 所指的内存空间重叠时, memmove() 仍然能处理,不过执行效率比 memcpy() 低一些

C语言如何用malloc函数开辟动态数组???

函数原型为

void*malloc(unsigned int size);

其作用是在内存的动态存储区中分配一个长度为size的连续空间。形参size的类型为无符号整型(不允许为负数)。返回值是所分配区域的第一个字节的地址。如

malloc(100); //开辟100字节的临时分配域,返回值为其第一字节的地址

在C语言中如何使用malloc动态申请一维数组?

malloc()函数用来动态地分配内存空间,其原型为:void*malloc(size_tsize);

描述:

(参数描述)

Size是以字节为单位分配的内存空间量。

【功能描述】

Malloc()在堆中分配指定大小的内存空间来保存数据。函数执行后,此内存空间未初始化,且其值未知。如果希望在分配内存的同时进行初始化,可以使用calloc()函数。

(返回值)

分配成功时返回指向内存的地址,失败时返回NULL。

操作:

由于在请求内存空间时,可能有内存空间,也可能没有内存空间,所以在继续之前,您需要自己决定应用程序是否成功。

如果size的值为0,返回值可能为NULL,也可能不为NULL,这取决于标准库实现,但是不应该再次引用返回的指针。

注意:函数的返回值类型为void*,Void并不意味着没有返回值或空指针,而是返回的指针类型未知。所以当你使用malloc()时,你通常需要将void指针转换成你想要的类型,例如:

# include stdlib。H

TypedefintListData;

ListData*数据;//存储空间的基本地址

Data=(ListData*)malloc(100*sizeof(ListData));

扩展资料:

实现malloc的方法:

(1)数据结构

首先,我们要确保数据结构。一个简单可行的解决方案是将堆内存空间组织成块,每个块由一个元区域和一个数据区域组成,元区域记录关于数据块的元数据(数据区域大小、空闲标志位、指针等)。

数据区域是实际分配的内存区域,数据区域的第一个字节地址是malloc返回的地址。

(2)找到正确的街区

现在考虑如何在区块链中找到合适的区块。一般来说,有两种搜索算法:

Firstfit:从头开始,使用第一个大于所需大小的数据块称为已分配的块

最佳匹配:从头开始遍历所有块,使用数据区域大小大于大小且分配的块的差异最小的块

最适合的有一个高的有效载荷和第一个适合有一个高的操作效率。这里我们使用第一个fit算法。

(3)创建一个新的块如果现有的块都不能满足size的要求,则需要在列表的末尾创建一个新的块。

(4)分块先拼装有一个致命的缺点,那就是它可能允许较小的尺寸占据一个较大的块。在这种情况下,为了改进有效负载,当剩余的数据区域足够大时,应该将其划分为一个新的块。

(5)malloc的实现

通过上面的代码,我们可以实现一个简单的malloc。注意,首先我们需要定义链表的第一个块,first_block,初始化为NULL;此外,我们需要至少剩下的空间BLOCK_SIZE+8来执行除法操作

因为我们需要malloc分配数据区域在8字节处对齐,所以大小不适用于8个倍数,所以我们需要调整大小,使其大于8的最小倍数的大小。

数据结构基础之动态内存分配(malloc)

C语言提供了四个基本的动态内存管理(内存分配与释放)函数,这些函数的原型包含在stdlib.h头文件里。

它们分别是:

1.malloc()/free()函数

2.calloc()函数

3.realloc()函数

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,一般需和free函数配对使用。

本篇只对malloc进行讲解

malloc()函数在堆中申请分配一个大小为size个字节的连续内存空间,若成功分配,则返回一个指向 所分配空间起始地址 的指针,否则返回空指针(NULL)。

free()函数用来释放已分配的内存空间,参数p是待释放的内存空间的首指针