下面来介绍动态内存分配函数相关应用
头文件stdlib.h
1.介绍第一个malloc函数
其函数原型为void * malloc(unsigned int size);
其作用是在内存的动态存储区中分配一个长度为size的连续空间。
返回值:是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
#include<iostream>
using namespace std;
int main()
{
int* p = (int*)malloc(4);
if (p == NULL)
cout << "空间申请失败";
else
{
for (int j = 0; j < 4; j++)
{
*p = j;
cout << *p;
p++;
}
free(p);
p = NULL;
}
}
2.下面介绍free函数原型: void free(void *ptr)
专门是用来做动态内存的释放和回收的。
功能 : 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,
以后可在调用malloc、realloc以及calloc函数来再分配。
!!!并不是将ptr置为NULL,所以调用free时,紧接着将ptr=NULL,防止错误使用ptr
举例见上。
3.下面介绍colloc函数。
函数原型:void * calloc(unsigned int num,unsigned int size);
功能:在内存的动态存储区中分配num个长度为size的连续空间,函数返回一个指向分配起始地址的指针;
如果分配不成功,返回NULL。
功能:在内存的动态存储区中分配num个长度为size的连续空间;
注意:num:对象个数,size:对象占据的内存字节数,
相较于malloc函数,calloc函数会自动将内存初始化为0;
函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (NULL != p)
{
//使用
}
free(p);
p = NULL;
return 0;
}
4.下面介绍realloc函数
原型:void* realloc(void*ptr,unsigned int size)
指针名 = (数据类型 * )realloc(要改变内存大小的指针名,新的大小)。
新的大小可大可小:
如果新的大小大于原内存大小,则新分配部分不会被初始化;
假如原来的内存后面还有足够多剩余内存的话,realloc的内存 = 原来的内存 + 剩余内存,realloc还是返回原来内存的地址;
假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉, realloc返回新内存的地址
如果新的大小小于原内存大小,可能会导致数据丢失
#include <stdio.h>
int main()
{
int* ptr = (int*)malloc(100);
if (ptr != NULL)
{
//使用空间;
}
else
{
exit(1);
}
//扩展容量
ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?)
//这样不可以,正确如下操作:
int* p = NULL;
p = (int*)realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
ptr = NULL;
return 0;