C语言进阶——动态内存管理基础知识

C语言进阶——动态内存管理基础知识

为什么要有动态内存管理这个概念呢?因为我们平时定义一个数组,都是诸如此类:

int num[10];

我们要知道,数组的存储是在栈上开辟存储空间,而栈的大小只有1——2MB,很少,而且程序运行起来不止有数组,还有别的局部变量和函数调用都要在栈上进行,所以当数组的数据太多时就会牵扯到栈溢出的问题,而且数组定义好后大小是不能变的,所以引入动态内存的概念,因为动态数据不在栈上存储,而是在堆上存储,而堆比栈的大小大的多一般32位操作系统下为4GB,而且内存可以进行动态划分,用多少分多少。(以下所有函数均在头文件stdlib.h中)
1.动态内存规划的第一个函数malloc函数
函数参数(1个):字节数,即要分配多少个字节。返回值为一个无类型地址,即void*。
函数原型:void malloc( size_t size );
当然内存分配好后未初始化时,存储的是随机值。
2.动态内存规划的第二个函数calloc函数
函数参数(2个):数据个数和一个数据所占的字节数(即int 4个字节,char 1个字节……)。返回值为一个无类型地址,即void

函数原型:void calloc( size_t num, size_t size );
当然内存分配好后未初始化时,默认存储的是0,这是和malloc最本质的区别。
3.动态内存规划的第三个函数realloc函数
函数参数(2个):需要重新分配内存的指针名和重新分配的字节数。返回值为一个无类型地址,即void

函数原型:void *realloc( void *memblock, size_t size );
温馨提示:建议你在使用完这个函数是不要急着将返回值赋给之前的地址指针,防止数据丢失。
4.动态内存规划的第四个函数free函数
堆中的内存和栈中的内存不一样,因为栈中的数据程序执行完会自动释放,而堆中不一样,它不会自动释放,如果不释放就会产生内存泄漏(即内存越用越少),所以就有了free函数。
函数参数(1个):待释放的内存地址(即指针指向的地址)。无返回值。
函数原型:void free( void *memblock );
这个函数会将以指针指向的地址为首地址的动态内存释放掉。

你可能感兴趣的:(C语言进阶——动态内存管理基础知识)