int main()
{
int a = 10;
int* p = &a;
free(p);
p= NULL;
return 0;
}
free()释放的是动态开辟的空间;
不能释放栈区上的内存;
int main()
{
//malloc
int* p = NULL;
free(p);
return 0;
}
释放空指针NULL时free函数什么都没干;
malloc函数
函数介绍:void *calloc( size_t num, size_t size);
size_t num:该参数表示开辟空间的个数;
size_t size:该参数表示开辟每个空间的大小(字节);
函数返回开辟空间的起始位置;
函数会将每个空间初始化为0;初始化功能不能初始化其他数字;
int main()
{
int*p = (int*)calloc(10,sizeof(int));
if(p ==NULL)
{
printf("%s \n", strerror(errno));
return 1;
}
//打印
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ",*(p + i));
}
//释放free(p);p = NULL;
return 0;
}
对于malloc和calloc函数的使用
如果想要初始化使用calloc;
如果不想使用malloc函数;
calloc=malloc+memset;
realloc函数
realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。
那realloc函数就可以做到对动态开辟内存大小的调整。
函数介绍:void* realloc (void* ptr,size_t size);
ptr是要调整的内存地址
size调整之后新大小
1.返回值为调整之后的内存起始位置。
2.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。o realloc在调整内存空间的是存在两种情况:
3.情况1:原有空间之后的空间不够扩容
情况2:原有空间之后有足够大的空间
空间足够时直接向后扩容返回起始位置的地址;
空间不够时会在内存中找到并开辟一块足够的空间返回新空间的起始地址
(同时旧空间的数据也会被拷贝到新空间内;释放旧空间内存);
realloc函数的使用
int main()
{
int*p = (int*)malloc(40);
if (NULL == p)
{
printf("%s\n", strerror(errno));
return 1;
}
//使用
//1 2 3 4 5 6 7 8 9 10
int i = 0;
for (i = 0; i< 10; i++)
{
*(p +i)= i+ 1;
}
//扩容
/*int* ptr = (int*)realloc(p,80);这里如果我们直接用p=realloc(p,80)这样的赋值是非常危险的;realloc 函数有可能扩容失败返回NULL这样会让p指针指向NULL找不到原来数据的地址; p指针的失忆造成严重的数据丢失;*/
if (ptr != NULL) //所以这里我们要进行一个过度操作确保realloc函数操作成功后再赋值;
{
p = ptr;
}
return 0;
}
用realloc实现malloc的功能;
int main()
{
realloc(NULL,40);//malloc (40);
return 0;
}
给realloc函数要扩容空间的起始位置一个NULL;它的功能和malloc函数是等价的;