堆区内存管理

malloc

void malloc(size)
size类型是unsigned int,为字节数。

int* p1=(int*)malloc(5); //在堆区中申请5Byte的内存空间,将首字节地址赋给p1,后面就可以通过p1去访问这块内存空间

//如果申请失败,malloc函数返回NULL,通常原因是系统堆区空间不够造成的
if(NULL == p1)
{
    printf("动态申请内存空间失败!\n");
    return 1;
}

calloc

calloc(n,size)
分配n个,每个size字节。

int a1[5]; //栈区数组

int* const a2=(int*)calloc(5,sizeof(int)); //堆区数组
int* const a3=(int*)malloc(5*sizeof(int)); //和上面完全等效

free

堆区空间申请了不释放, 运行时会导致内存泄露,运行完了会导致内存浪费。重启可以解决。
void free(void *ptr)

  • 其参数必须为malloc或calloc的返回值,基类型任意。
  • 不能释放一部分,只能释放整体。
  • 只需要释放一次,不要多重释放。

bzero

bzero(str,size)清零,size为清零的长度

Char* str=malloc(1001);//堆区数组 
bzero(str,1001);
Char str2[1001];//栈区数组 
bzero(str2,sizeof(str2));

memset

memset(str1,97,n);
将指定str1指向的内存区域的前n个字节以char写入,第二个参数是int型,但是必须0-255之间, 会自动转换成unsigned char。

memcpy

int i=0x41424344;
memcpy(str,&i,sizeof(int));
把&i的内存空间拷贝给str,长度为sizeof(int)。
void* menccpy(void* dest,const void* src,int c,size_t n);
第一个参数是目标,第二个是源,第三个是字符,第四个是长度。
拷贝的时候会检查c是否出现,如果有则返回该位置的下一个字节地址。没有则返回0。
memmove(和memcopy功能完全一样,但是它允许目标内存空间和原内存空间存在交叉,效率稍低点)参数是:目标,源,长度。

realloc

扩充空间:如果后面的内存不够,操作系统会将整体搬移到位置足够的地方,返回首地址。
realloc(p1,500); 将p1的空间扩充到500(是到500不是加500)

realloc内部实现的基本原理:

void* realloc(void* src, size_t new_size)
{
    void* p=malloc(new_size);

    memcpy(p,src,old_size);
    free(src);

    return p;
}

转载于:https://my.oschina.net/HappyTeemo/blog/1558503

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值