动态开辟空间|柔性数组
动态开辟空间
malloc|free
malloc是在堆上找一片连续的空间使用,最后要使用free释放掉malloc出的空间上的内容。
malloc的函数声明
//这里的size_t size指的是要使用的字节数
void* malloc (size_t size);
free的函数声明
void free (void* ptr);
示例:
#include <stdlib.h>
int main()
{
//malloc原本是要返回void*指针,这里要强转成int*
//这里使用的4个int(4个字节)类型的空间,共16字节
int* a = (int*)malloc(sizeof(int) * 4);
//free掉a地址上的内容,但不会修改a的值。
free(a);
//将a指向NULL
a = NULL;
}
calloc
calloc的函数声明
//num是要申请的数据个数
//size是每个数据类型所占的字节数
void* calloc (size_t num, size_t size);
示例
#include <stdlib.h>
int main()
{
//申请4个int类型的连续堆空间
int* a = (int*)calloc(4,sizeof(int));
free(a);
a = NULL;
}
calloc方式会将申请的空间赋上初值0,请看内存显示:
realloc
如果初次的malloc和calloc申请的堆空间不够,就需要使用realloc进行扩容。
//ptr原堆指针,size需要重新申请的字节数
void* realloc (void* ptr, size_t size);
如果当前地址的堆空间够realloc扩容的空间,那么就原地扩容。
如果当前地址的堆空间不够realloc扩容的空间,那么就异地扩容,就是重新找个满足realloc扩容空间的连续堆空间。
示例
#include <stdlib.h>
int main()
{
int* a = (int*)calloc(4,sizeof(int));
a = (int*)realloc(a, sizeof(int) * 8);
free(a);
a = NULL;
}