动态内存分配的函数
malloc的使用
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
- 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己
来决定。
#include <errno.h>
#include <string.h>
#include <stdlib.h>//malloc函数头文件
int main()
{
//申请40个字节,用来存放10个整型
int* p = (int*)malloc(40);
if (p == NULL)
{
printf("%s\n", strerror(errno));
//如果失败会返回错误码
//也可以用perorr
return 1;
}
//存放1~10
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i + 1;
}
//打印
for (i = 0; i < 10; i++)
{
printf("%d\n", *(p + i));
}
//free是释放申请的内存
free(p);
p = NULL;
return 0;
}
free函数的使用
如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
如果参数 ptr 是NULL指针,则函数什么事都不做。
calloc的使用
- 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
- 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)calloc(10, sizeof(int));
if(NULL != p)
{
}
free(p);
p = NULL;
return 0;
}
//使用空间
realloc的使用
- realloc函数的出现让动态内存管理更加灵活。
- -有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那 realloc 函数就可以做到对动态开辟内存大小的调整。
/**int main()
//{
// int*p = (int*)malloc(5 * sizeof(int));
// if(NULL == p)
// {
// perror("malloc");
// return 1;
// }
// //使用
// int i = 0;
// for (i = 0; i < 5; i++)
// {
// *(p + i) = 1;
// }
// //不够了,增加5个整型的空间
// int* ptr = (int*)realloc(p, 10*sizeof(int));
// if (ptr != NULL)
// {
// p = ptr;
// ptr = NULL;
// }
// //继续使用空间
// for (i = 0; i < 10; i++)
// {
// printf("%d ", *(p + i));
// }
//
// //释放空间
// free(p);
// p = NULL;
//
// return**
realloc增加空间有两种形式
如果扩容失败,会把旧的数据也丢失掉。如果我们用接受malloc的指针接受,如果失败会返回NULL,原本的数据也会被丢失。