【C语言】【动态内存管理】malloc,free,calloc,realloc
1.malloc函数
void* malloc(size_t size)
功能:向内存申请字节为 size大小的空间
使用时要包含头文件:<stdlib.h>
开辟成功:返回开辟好的空间初始地址的指针
开辟失败:返回空指针 NULL
使用举例:
(malloc和free要成对使用,举例放在free部分)
2.free函数:
void free(void* p)
注意:free只是用来释放动态内存的,如果不是动态开辟的内存空间,那么free的行为将未定义
使用时要包含头文件:<stdlib.h>
使用举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(4*sizeof(int));
int i = 0;
if (p == NULL)
{
perror("malloc");
return 1;
}
for (i = 0;i < 4;i++)
{
*(p + i) = i + 1;
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
注意:free§以后要将p定义为空指针,因为free的功能只是把内存空间释放,但释放完后p还存着那块空间的地址,如果不及时定义为空指针,那么p就会成为野指针
3.calloc函数:
void* calloc(size_t num,size_t size)
功能:向内存申请num个大小为size字节的空间
并且申请的每个字节都初始化为 0
举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)calloc(4, sizeof(int));
if (p == NULL)
{
perror("calloc");
return 1;
}
int i = 0;
for (i = 0;i < 4;i++)
{
printf("%d ", * (p + i));
}
return 0;
}
4.realloc函数:
void* realloc(void* p,size_t size)
功能:调整已经开辟的动态内存的大小
p 是要调整的内存的地址
size是调整后总内存的大小
返回值为调整后内存的起始位置的地址
调整空间存在两种情况:
加入两个字节的内存要调整为4个字节:
1.内存够大,从p 地址往后延申两个字节:
2.p后面不足两个字节,那么就会开辟一块新的空间来存储这 4 个字节的内容
使用举例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)malloc(4 * sizeof(int));
int i = 0;
if (p == NULL)
{
perror("malloc");
return 1;
}
for (i = 0;i < 4;i++)
{
*(p + i) = i + 1;
printf("%d ", *(p + i));
}
int* ptr = (int*)realloc(p, 8 * sizeof(int));
if (ptr != NULL)
{
p = ptr;
ptr = NULL;
}
else
return 1;
while (8 - i)
/*for (i = 4;i < 8;i++)*/
{
*(p + i) = i + 1;
printf("%d ", *(p + i));
i++;
}
free(p);
p = NULL;
return 0;
}
注意:这里为了防止realloc调整空间不成功返回空指针,临时创建个ptr指针来接收地址,确认开辟成功时再将空间地址交给 p ,并把ptr定义为空指针(不能free(ptr),否则p指向的空间也会被回收!!!)