malloc函数
函数名 | void * malloc(size_t size) |
---|---|
所在文件 | stdlib.h |
功能 | 申请堆内存并返回,申请的空间并未初始化 |
参数 | size_t size表示要申请的长度 |
返回值 | 成功:返回申请的空间 失败:返回NULL |
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
/*
* malloc
* 第一个参数: 需要申请多少个字节空间
* 返回值类型: void *
*/
int *p = (int *)malloc(sizeof(int));
printf("p = %i\n", *p); // 保存垃圾数据
/*
* 第一个参数: 需要初始化的内存地址
* 第二个初始: 需要初始化的值
* 第三个参数: 需要初始化对少个字节
*/
memset(p, 0, sizeof(int)); // 对申请的内存空间进行初始化
printf("p = %i\n", *p); // 初始化为0
return 0;
}
free函数
函数名 | void free(void *p) |
---|---|
所在文件 | stdlib.h |
功能 | 释放申请的内存 |
参数 | void *p指向申请的内存 |
返回值 | 无 |
注意:通过malloc申请的堆内存必须释放,所以malloc与free总是成对出现
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
// 1.申请4个字节存储空间
int *p = (int *)malloc(sizeof(int));
// 2.初始化4个字节存储空间为0
memset(p, 0, sizeof(int));
// 3.释放申请的存储空间
free(p);
return 0;
}
calloc函数
函数名 | void *calloc(size_t nmemb,size_t size) |
---|---|
所在文件 | stdlib.h |
功能 | 申请堆内存并返回,所申请空间自动清零 |
参数 | size_t nmemb所需单元数 size_t size单元大小 |
返回值 | 成功:返回指向申请空间的指针 失败:返回NULL |
示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
/*
// 1.申请3块4个字节存储空间
int *p = (int *)malloc(sizeof(int) * 3);
// 2.使用申请好的3块存储空间
p[0] = 1;
p[1] = 3;
p[2] = 5;
printf("p[0] = %i\n", p[0]);
printf("p[1] = %i\n", p[1]);
printf("p[2] = %i\n", p[2]);
// 3.释放空间
free(p);
*/
// 1.申请3块4个字节存储空间
int *p = calloc(3, sizeof(int));
// 2.使用申请好的3块存储空间
p[0] = 1;
p[1] = 3;
p[2] = 5;
printf("p[0] = %i\n", p[0]);
printf("p[1] = %i\n", p[1]);
printf("p[2] = %i\n", p[2]);
// 3.释放空间
free(p);
return 0;
}
realloc函数
函数名 | void realloc(void ptr,size_t size) |
---|---|
所在文件 | stdlib.h |
功能 | 扩容或缩小原有的堆内存,通常用于扩容 |
参数 | void *ptr表示待扩容的指针 size_t size表示扩容或缩小后的内存大小 |
返回值 | 成功:返回指针指向申请的空间 失败:NULL |
注意:
1)若ptr==NULL,则等同于使用malloc函数;
2)返回的指针可能与ptr相同也可能不同,取决于后续空间是否够用