C语言动态内存分配malloc、calloc、realloc

动态内存

根据需要动态创建需要的内存。例如根据变量创建数组,其内存区域在堆。这里简单提一下堆与栈

:局部变量所在的内存区域,在Windows默认其大小为1M,系统自行管理其内存(即你不用管回收问题)

:动态内存所在区域,默认大小为2G左右(不同平台有差别),程序管理内存,特别要注意内存释放

从以上栈与堆的大小可以知道,堆比栈大的多,所以动态内存还有一个使用场景,即需要创建大容量的数组时

malloc、calloc、realloc

malloc(字节数): 创建成功,函数返回一个指向分配起始地址的指针,失败返回NULL,内存数据为没有初始化的随机值

calloc(单元个数,每个单元的字节数): 创建成功,函数返回一个指向分配起始地址的指针,失败返回NULL,内存数据初始化为0

realloc(旧内存地址,新的内存字节大小): 用于修改动态内存的大小

注意:这三个是C语言表中库中的函数,使用时要引用头文件stdlib.h,返回的地址都是void*类型,要强制类型转换成你所要用的类型

malloc与calloc主要区别: 1.malloc内存数据未初始化,为随机值,calloc内存数据初始化为0,
2.malloc只有一个参数,calloc有两个参数,注意看他们的函数原型声明:void* malloc(unsigned size); void* calloc(size_t nelem, size_t elsize)

free

free(地址): 释放动态创建的内存,不释放会发生内存泄漏
free在使用的时候在以下情况会崩溃:1.越界(动态分配的内存太小)2.动态内存指针发生移动 3.重复释放

解释一下第二条动态内存指针发生移动导致free失败的原因
free函数只有一个参数,即分配的内存的首地址,它只用这一个信息就知道要释放多大的内存,这是因为动态分配的内存的那个首地址记录了它后边的分配的空间的大小的信息,因此只传给free函数内存首地址即可,若这个地址(指针)发生了移动,free就会崩溃。

猜你喜欢

转载自blog.csdn.net/huifaguangdemao/article/details/106295341