1.定义:
需从堆上开辟空间使用,开辟成功后由指针进行空间的运用。
2.malloc函数
a.函数原型:void *malloc( size_t size );
b.例
int* p=(int *)malloc(10*sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
free(p);
p=NULL;
char* cp=(char*)malloc(100*sizeof(char));
if(cp==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
free(cp);
cp=NULL;
typedef struct Stu
{
int i;
float f;
}stu;
stu* s=(stu*)maloc(10*sizeof(stu));
if(s==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
free(s);
s=NULL;
c.注意
@1:返回的是开辟空间的首地址
@2:原则上开辟后的空间返回地址类型为void*型,在我们实际用时常常要用强转,故灵活性强
@3:不仅能开辟常用类型(int char double等),还能开辟组合类型(结构体等)
@4:申请不一定成功,该函数申请失败返回NULL,故判断空间指向指针为NULL是申请不成功,不能使用
@5:使用完要返还给内存,用free函数
@6:即使我们用了free函数将指针所指向空间释放了,但是指针还保留有开辟空间的起始地址,当我们进行解引用时,就会产生指针所指空间不属于自己,但我们去使用了,导致一些未知性错误(free后指针置NULL)
@7:动开辟的空间是连续的,同数组一样使用,都要防止越界访问
void test()
{
int* p=(int *)malloc(10*sizeof(int));
int i=0;
if(p==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
for(i=0;i<10;i++)
{
*(p+i)=i;
}
free(p);
p=NULL;
}
3,calloc函数
a,函数原型:void *calloc( size_t num, size_t size );
b,例
int* p=(int *)calloc(10,sizeof(int));
char* cp=(char*)=calloc(100,sizeof(char));
c,注意
@1:malloc函数注意点它也同样适用
@2:该函数开辟的空间中元素全部置0(相当于初始化为0)
4,realloc函数
a, 函数原型:void *realloc( void *memblock, size_t size );
b,例
int* p=(int*)malloc(10*sizeof(int));
int *newp=NULL;
newp=(int*)realloc(p,20*sizeof);
if(newp==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
p=newp;
free(p);
p=NULL;
c.注意
@1:malloc函数注意点它也同样适用
@2:realloc函数可扩可缩
@3:realloc函数在扩大空间时,保留原来空间中的数据,在缩小时,会将尾部的数据舍弃
@4:扩大空间的2种情况: