目录
四、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.动态内存空间忘记释放(内存泄漏)