1.malloc函数
c语言提供了一个动态内存开辟的函数:void*malloc(size_t size)
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针
如果开辟成功,返回一个指向开辟好空间的指针,如果开辟失败,返回NULL,因此malloc的返回值一定要做检查。由于返回值是void*,所以malloc函数并不知道开辟的空间类型是什么,要有使用者来决定。
如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。
2.free函数(用来释放动态开辟的内存)void*free(void*memblok)
(1)如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的
(2)如果ptr是NULL指针,则free什么事都不做
举个例子,看代码
int main()
{
int*p=(int*)malloc(40);
if(p==NULL)
{
printf("%s",strerror(errno));
}
else
{
int i=0;
for(i=0;i<10;i++)
{
*(p+i)=i;
}
for(i=0;i<10;i++)
{
printf("%d",*(p+i));
}
free(p);
p=NULL;
}
return 0;
}
3.calloc函数
c语言还提供了一个函数叫calloc,calloc函数也用动态内存分配
void*calloc(size_t num,size_t size)
函数的功能是为num个大小为size的元素开辟一块空间,并把空间的每个字节初始化为0
int main()
{
int*p=(int*)calloc(10,sizeof(int));
if(p==NULL)
{
printf("%s",strerror(errno));
}
else
{
int i=0;
for(i=0;i<10;i++)
{
*(p+i)=i;
}
for(i=0;i<10;i++)
{
printf("%d",*(p+i));
}
free(p);
p=NULL;
}
return 0;
}
4.realloc函数
realloc函数可以调整开辟内存大小,void*realloc(void*ptr,size_t size)
(1)ptr是要调整的内存地址
(2)size调整新大小
(3)返回值为调整后内存空间的起始位置
(4)这个函数调整原来的内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
int main()
{
int*p=(int*)malloc(20);
if(p==NULL)
{
printf("%s",strerror(errno));
}
else
{
int i=0;
for(i=0;i<5;i++)
{
*(p+i)=i;
}
int*ptr=realloc(p,40);
if(ptr!=NULL)
{
p=ptr;
}
for(i=5;i<10;i++)
{
*(p+i)=i;
}
free(p);
p=NULL;
}
return 0;
}