动态内存的开辟

目录

一、malloc函数

二、calloc函数

三、realloc函数

四、free函数

五、常见错误

动态内存分配都是在堆区完成的

三个函数的头文件都为:

#Include<stdlib.h>

一、malloc函数

malloc向内存申请一片连续可用的空间,并返回这块空间的指针,如果开辟失败则返回一个NULL指针。

void* malloc (size_t size);

根据查找资料可知,size_t的类型是无符号整型,它是以字节为单位储存在内存中的。

返回值:

 

通过上图我们可以看处,此函数的返回值为void*,可以把它强制转换成任意类型的指针。 

 上述代码可以看到我们开辟了40个字节的动态内存空间。通过对其内存的查看发现他内存里的值都是随机值,并不进行出初始化

 

二、calloc函数

分配和零初始化数组

为num元素数组分配一块内存,每个元素的大小为字节长,并将其所有位初始化为零。

有效的结果是分配一个零初始化内存块(num*size)字节。

如果大小为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但不应取消对返回指针的引用。

 

void* calloc (size_t num, size_t size);

通过资料可知,num是要分配的元素数,size是每个元素的大小

代码如下:

内存如下:

 一共申请如上所述num*size个字节等于120个字节的动态内存,并且全部初始化为零。

返回值和malloc一样。

三、realloc函数

void* realloc (void* ptr, size_t size);

 

 

重新分配内存块

更改ptr指向的内存块的大小。

函数可以将内存块移动到新位置(函数返回其地址)。

内存块的内容最多保留新大小和旧大小中较小的一个,即使将内存块移动到新位置也是如此。如果新大小较大,则新分配部分的值不确定。

如果ptr是空指针,则函数的行为类似于malloc,分配一个新的大小字节块并返回指向其开头的指针

此函数有两种开辟内存的方式:

1.由原来开辟的空间后接空间(黄色代表已开辟的空间,红色代表心开辟的空间)

 如果前面开辟的空间小,后扩展的内存可以接下的话可以直接在后面开辟空间。

2.重新开辟空间

 原来开辟空间后不够接新内存,所以重新选择一块空间开辟,再把原来空间的内容复制过来。

 

ptr指向以前用malloc、calloc或realloc分配的内存块的指针。

或者,这可以是一个空指针,在这种情况下,会分配一个新块(就像调用了malloc一样)。

size是新内存的大小,不是需要增加空间的大小!!!

代码如下:

 四、free函数

void free (void* ptr);

取消分配内存块

先前通过调用malloc、calloc或realloc分配的内存块被释放,使其可再次用于进一步分配。

如果ptr没有指向由上述函数分配的内存块,则会导致未定义的行为。

如果ptr是空指针,则函数不执行任何操作。

注意,这个函数并没有改变ptr本身的值,因此它仍然指向相同(现在无效)的位置。

最后再将原来的指针置为NULL.

五、常见的错误

1.对空指针进行解引用.

2.对动态开辟的空间越界访问

3.对非动态内存开辟使用free

4.使用free释放动态内存的一部分(在释放的时候,p指向的不是动态内存空间的起始部分)

5.同一块空间的多次释放

6.动态内存空间忘记释放(内存泄漏)

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值