zoukankan      html  css  js  c++  java
  • memmove、memcpy、strcpy、memset的实现

    memmove、memcpy、strcpy、memset

    原型为:

    void *memmove( void* dest, const void* src, size_t count );

    char* strcpy(char* dest, const char* src);

    void *memcpy(void *dest,  const char* src,  size_t count);

    void* memset(void* dest, int value, size_t num)。

     (1)strcpy提供了字符串的复制。

      即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

     (2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广

    (3)复制的内容不同。

      strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

    (4)复制的方法不同。

      strcpy不需要指定长度,它遇到被复制字符串的结束符"”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

    (5)用途不同。

      通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

    (6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些

    memcpy的实现:

     1 //size_t指的是unsigned int
     2 char* memcpy(void* dest,const void* src, size_t num) 
     3 { 
     4   char* p_dest = (char*)dest; 
     5   const char* p_src = (const char*)src;
    6 assert((dest != NULL) && (src != NULL) && (dest != src)); 7 while(num-- > 0) 8 *p_dest++ = *p_src++; 9 return dest; 10 }

    strcpy的实现:

    1 char* strcpy(char* dest, const char* src) 
    2 {
    3   assert((dest!=NULL) && (src!=NULL) && (dest!=src));
    4   char* address = dest;
    5   while(*dest++ = *src++ )
    6     NULL;
    7   return address; 
    8 }

    memmove的实现:

     1 char* memmove(void* dest, const void* src,size_t num) {
     2   assert((dest!=NULL) && (src!=NULL) && (dest!=src));  
     3   char* p_dest = (char*)dest;
     4   const char* p_src = (const char*)src;
     5 
     6   if(p_dest > p_src && p_dest < p_src + num) //内存有重叠,逆向拷贝
     7   {
     8     p_dest += num - 1;
     9     p_src += num - 1;
    10     while(num--)
    11       *p_dest-- = *p_src--;     
    12   }
    13   else 
    14   { //p_dest<=p_src,此时无论是否重叠都可以使用正向拷贝
    15     while(num--)
    16       *p_dest++ = *p_src++;
    17   }
    18   return dest;
    19 }

    memset的实现:

    1 char* memset(void* dest, int value, size_t num) 
    2 {
    3   assert(dest != NULL);
    4   unsigned char* p_dest = (unsigned char*)dest;
    5   while(num-- > 0) 
    6     *p_dest++ = (unsigned char)value;
    7   return dest;
    8 }
  • 相关阅读:
    error C2054: 在“inline”之后应输入“(”
    SendInput模拟键盘操作
    获取广电高清直播源
    Lua使用luasocket http请求例子
    枚举所有继承特定接口的类
    Stream Byte[] 转换
    async await
    C# ServiceStack.Redis 操作对象List
    resharper安装后,一不小心点错了(选择了object browser)
    fiddler 挂载 JS文件
  • 原文地址:https://www.cnblogs.com/cpsmile/p/4426028.html
Copyright © 2011-2022 走看看