C/C++中的内存操作函数

背景:小白今天机缘巧合碰到了内存处理函数:memcpy,memmove,犹记得看到他两的那一刹那,你不认识我,我认识你的尴尬局面,现翻了翻网,总结了一下

常见的内存操作函数:

1.  malloc / calloc    

功能:动态内存分配函数

 头文件:#include < stdlib.h > 

 函数原型:(void *)malloc ( size_t size );    // void *) 代表的是指向不确定类型的指针

                     (void * )calloc(int num, size_t size)//num为分配内存块的个数,size为分配内存块的大小

返回值:分配成功返回分配内存的首地址,失败返回NULL

区别:a. malloc一次只申请一个内存区,calloc一次可以申请多个内存区(calloc中有个内存块的参数num)

            b. malloc不会对分配的内存初始化,calloc会初始化为0

注:malloc和calloc是C里面的用法,综合效果来说,不如C++中new,new不用考虑那么多,直接用即可。


2. free 

功能:动态内存释放

头文件:#include < stdlib.h >

函数原型:void free ( ( void * )  ptr)//ptr为malloc或者calloc返回的分配内存的首地址,即内存指针

返回值:无

注:a. free是C中的释放内存的函数,C++中用的是delete,用法:一: delete ptr ;( 释放ptr指针相对应的内存 )    二: delete [ ] ptr ;( ptr为指向数组的指针 )

        b. malloc( calloc )和 free 是一一对应的,若有malloc或者calloc,但是没有free,容易造成内存泄露,同理,new 和 delete 也是一一对应的。


3. memcpy

头文件:#include < string.h >

函数原型:( void * )memcpy ( void * dest,const void * src,size_t n ) //dest为目标内存区,src为源内存区,n为需要拷贝的字节数

函数功能:拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束' \0 '而结束

返回值:返回指向dest的指针 //网上有说返回的是src的指针,这个有待小白考证!

局限性:为考虑内存重叠情况//dest <= src-count 或dest >= src+count时,会产生覆盖问题,即源数据会被更改

函数实现:

void *memcpy(void *dest, void *src, size_t n)  
{  
  (char *)ret = (char *)dest;  
  (char *)dest_t = ret;  
  (char *)src_t = (char *)src;  
  while(n--)  
  {  
    *dest_t++ = *src_t++;  
  }  
  return ret;  
}  


4. memmove

头文件:#include < string.h >

函数原型:(void *)memmove(void * dest,void * src,size_t n)//dest为目标内存区,src为源内存区,n为需要拷贝的字节数

函数功能:将src所对应的内存前n的字节的内容移动到dest对应的内存区
返回值:指向dest的指针

注:相比memcpy,当dest与src重叠时,仍能正确处理,但是src的内容会改变

函数实现:

void *memmove(void *dest, void *src, size_t n)  
{  
    char *ret = char *dest;  
    char *dest_t;  
    char *src_t;  
    if((unsigned char *dest <= unsigned char *src) || (unsigned char *dest >= unsigned char *src + n))  
    {  
        dest_t = char *dest;  
        src_t = char *src;  
        while(n--)  
        {  
            *dest_t++ = *src_t++; //正向拷贝  
        }  
    }  
    else  
    {  
        dest_t = char *dest + n - 1;  
        src_t = char *src + n - 1;  
        while(n--)  
        {  
            *dest_t-- = *src_t--; //反向拷贝  
        }  
    }  
    return ret;  
}

6. 名称:memset
功能:初始化指定内存空间
头文件:#include <stdlib.h>
函数原型:void *memset(void *buffer, int c, size_t n);
其中:buffer为分配的内存,c为初始化你内容,n为初始化的字节数
返回值:指向buffer的指针
特别注意:memset是按字节为单位对buffer指向的内存赋值

例:int a[5];
memset(a, 3, 5*sizeof(int)); //错误
上述情况下每个int元素被初始化为:00000011 00000011 00000011 00000011
memset(a, 0, 5*sizeof(int)); //正确,全部初始化为0

7. 名称:memcmp
功能:比较两个内存空间的字符
头文件:#include <stdlib.h>
函数原型:int memcmp(const void *buf1, const void *buf2, size_t n);
其中:n为要比较的字符数
返回值:当buf1 > buf2时,返回 > 0;当buf1 = buf2时,返回 = 0;当buf1 < buf2时,返回 < 0。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值