动态内存开辟(malloc calloc realloc)

1.定义:

需从堆上开辟空间使用,开辟成功后由指针进行空间的运用。

2.malloc函数

a.函数原型:void *malloc( size_t size );

b.例

//动态开辟10个整型连续单元
int* p=(int *)malloc(10*sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
//使用.......
free(p);
p=NULL;
//动态开辟100个char型连续单元
char* cp=(char*)malloc(100*sizeof(char));
if(cp==NULL)
{
printf("%s\n",strerror(errno));
exit(1);
}
//使用.......
free(cp);
cp=NULL;
//动态开辟10个结构体连续单元
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种情况:

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值