动态内存分配函数的应用
动态内存分配函数有:malloc,calloc,realloc和free,下列来说说它们的用法
1.malloc函数
malloc函数是用来向堆区申请指定字节大小的空间,函数参数为申请空间的字节大小,返回值为一个void*的指针,若申请失败会返回NULL,具体用法如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)malloc(4*sizeof(int));//申请一个4个int类型大小的空间并把地址返回给一个int*类型的指针来接收
int i = 0;
if(p == NULL)
{
perror("The following error occurred");//p若为空指针,则打印原因
return 0;
}
for(i=0; i<4; i++)
{
*(p+i) = i;
printf("%d ", *(p+i));
}
free(p);//释放开辟的动态内存空间,还给操作系统
p= NULL;//把p指针置为空,防止安全问题发生
return 0;
}
2.calloc函数
calloc函数和malloc函数相似,也是用来向堆区申请开辟内存空间并返回地址,calloc函数的第一个参数为申请空间中存储的元素个数,第二个参数为元素类型所占字节大小,函数返回值类型为void*,此外calloc函数会在开辟内存空间时并把空间的每个元素初始化为0,具体用法如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)calloc(4, sizeof(int));//calloc函数第一个参数为元素个数,第二个参数为每个元素所占字节大小
int i = 0;
if(p == NULL)
{
perror("the error is: \n");//申请空间失败打印原因
return 0;
}
for(i=0; i<4; i++)
{
printf("%d \n", *(p+i));//calloc函数申请空间时会初始化每个元素为0
}
free(p);//释放p所指向的动态内存空间
p = NULL;//将p置为空,防止非法访问
return 0;
}
realloc函数
realloc函数是动态内存分配中非常重要的一个函数,它可以调整malloc和calloc所申请空间的大小,使其运用更加灵活,realloc函数的第一个参数为一个动态内存空间的指针,第二个参数为修改后的空间大小,返回值为修改后的空间地址,使用如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*) malloc(4*sizeof(int));
int i = 0;
if(p == NULL)
{
perror("the error is: \n");
return 0;
}
for(i=0; i<4; i++)
{
*(p+i) = i;
printf("%d ", *(p+i));
}
printf("\n");
int* ptr = (int*) realloc(p, 8*sizeof(int));//调整申请的动态内存空间大小并把调整后的空间地址返回,使用新变量来接收返回值
if(p != NULL)
{
p = ptr;
for(i=0; i<4; i++)
{
printf("%d ", *(p+i));//空间调整后原本空间中存储的内容不变
}
for(i=4; i<8; i++)
{
*(p+i) = i;//给新增的空间存储内容
printf("%d ", *(p+i));
}
}
free(p);
p = NULL;
return 0;
}
realloc函数注意事项:
1.如果p指向的空间之后有足够的内存可以追加可直接追加,后返回地址。
2.如果p指向的空间之后没有足够的内存空间可以追加,则realloc会重新找一块新的内存区域开辟一块满足需求的空间,并把原来内存中的数据拷贝回来,释放旧的内存空间,最后返回新开辟的内存空间地址。
3.要用一个新变量来接收realloc函数的返回值
4.free
free函数要与malloc/calloc函数成对使用,它是由来释放空间的,但释放后的指针并没有置为空指针依然有能力找到原本开辟的动态内存空间只会造成非法访问的问题,因此再用free释放空间后要把指针置为NULL。此外free释放的必须使动态开辟的内存空间,free空指针等于什么都没干。