1.内存

认识动态内存管理_动态申请内存

2.对于随时改变大小的类型,为了避免浪费或者不足,动态内存分配随之出现。

3.动态内存分配函数

  • malloc:   Allocates memory  blocks   函数原型 void*  malloc(size_t size);
  • free:Deallocates or free a memory block 函数原型 void free(void *memblock);
  • 举例应用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
int* p=(int*)malloc(10*sizeof(int));//向内存申请10个整形的内存空间
if(p==NULL)
{
//打印开辟失败的原因
printf("%s\n",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);//free函数用来释放动态开辟的空间
p=NULL;//p虽然被释放了,但是p还是能找到原来的空间,所以最好指向空指针
return 0;
}
  • calloc:Allocates an array in memory with elements ​initialized to 0
  • 函数原型:void* calloc(size_t num,szie_t size);
int main()
{
int *p=(int*)calloc(10,sizeof(int));
if(p==NULL)
{
printf("%d",strerror(errno));
}
else
{
int i=0;
for(i=0;i<10;i++)
{
printf("%d",*(p+i));
}
}
free(p);
p=NULL;
return 0;
}
  • realloc:Reallocate memory blocks
  • 函数原型:void* realloc(void* memblock,szie_t size);
  • memblock: Pointer to previously allocated memory block
  • size:New size in bytes
int main()
{
int *p=(int*)malloc(20);
if(p==NULL)
{
printf("%d",strerror(errno));
}
else
{
int i=0;
for(i=0;i<5;i++)
{
*(p+i)=i;
}
}
int *ptr=realloc(p,40);//调整原来动态申请的空间 有足够的空间时,直接追加,返回旧p
//当空间特别大时,则会重新找内存区域,并拷贝原来数据,释放旧内存,返回新开辟的内存空间
//得用新的变量接受realloc
if(ptr!=NULL)
{
p=ptr;

for(i=5;i<10;i++)
{
*(p+i)=i;
}
for(i=0;i<10;i++)
{
printf("%d",*(p+i));
}
}
free(p);
p=NULL;
return 0;
}