***1.***为什么要有动态内存
如果是单纯创建已创建数组的方式来存放数据,可能存在大小不够或者太大了浪费空间,若空间大小可以随着我们的使用随意增大减小就非常方便。
***2.***动态内存的函数有哪些
动态内存的函数共有四个
malloc calloc realloc free
这四个函数的头文件都是<stdlib.h>
***3.***四个动态内存函数的具体参数与使用
malloc:
分配内存的字节数块,返回指向该块开头的指针。
新分配的内存块的内容未初始化,仅保留不确定的值
void* malloc (size_t size);
参数就是需创建的空间大小 单位是字节
注意返回值是void* 需要强制类型转换成想要的类型
例:
int *a=(int *)malloc(5*sizeof(int));
这样就开辟了五个int大小的空间
calloc:
分配和零初始化数组
为元素数组分配一个内存块,每个元素的长度为字节,并将其所有位初始化为零。
void* calloc (size_t num, size_t size);
参数为 需要分配元素的个数 需要分配的元素类型的大小单位也是字节
注意返回值是void* 需要强制类型转换成想要的类型
例:
int *a=(int *)calloc(5,sizeof(int));
这样就开辟了五个int大小的空间 并且每个元素都初始化为0
(malloc 与 calloc 差异不大 主要是初始化问题 根据自己的需求选择使用就可以)
realloc:
重新分配内存块
更改 所指向的内存块的大小。
该函数可能会将内存块移动到新位置(该位置的地址由函数返回)。
void* realloc (void* ptr, size_t size);
这个函数可以改变前两个函数创建的数组的大小
参数 第一个参数为需要改变的动态内存的起始位置(若传入空指针 则和malloc效果一样且不会初始化为0)
第二个参数为希望修改后的空间的大小
例:
int*a=(int *)realloc(NULL,5*sizeof(int));
free:
解除分配内存块
先前由 调用 或 分配的内存块,使其再次可用于进一步分配,如果不指向使用上述函数分配的内存块,则会导致未定义的行为,如果 为空指针,则该函数不执行任何操作。
void free (void* ptr);
这个函数参数就是需要被释放的空间的起始地址 (也可以是NULL 函数不执行操作)
每次申请的动态内存在使用以后都需要free
动态内存在的错误: