memcpy函數和strcpy函數

1、memcpy指的是C和C++使用的內存拷貝函數,memcpy函數的功能時從源內存地址的起始位置開始拷貝若干個字節到目標內存地址中

  • 函數原型:  void *memcpy(void *dest, const void* src, size_t n);   //dest和src不一定是數組,任意的可讀可寫的空間均可
  • 頭文件:C中  #include<string.h>
  •                C++中 #include<cstring>
  • 函數返回指向des的指針
  • memcpy思想:大部分認爲memcpy是一個char到char的拷貝循環,擔心它的效率。實際上,memcpy是一個效率最高的內存拷貝函數,他不會那麼傻來做一個一個字節的內存拷貝,在地址不對齊的情況下,他是一個字節一個字節的拷,地址對齊以後,就會使用CPU字長來拷,32bit或64bit,還會根據CPU的類型選擇一些優化的指令來進行拷貝。總的來說,memcpy的實現是CPU類型、操作系統、cLib相關的。毫無疑問,它是內存拷貝里效率最高的,可以放心使用

2、memcpy函數的實現:

void *mymemcpy(void *dst, const void *src, size_t num)
{
    assert((NULL != dst) && (NULL != src));
    int wordnum = num / 4;  //計算有多少個32位,按4字節拷貝
    int slice = num % 4;    //剩餘的按字節拷貝
    int *pintsrc = (int *)src; //強制轉換類型,不同類型的不能進行拷貝
    int *pintdst = (int *)dst;
    while(wordnum--)
    {
        *pintsrc++ = *pintsrc++;
    }

    while(slice--)
    {
        ((char *)pintdst++) = *((char *)pintsrc++);
    }
    return dst;
}

3、strcpy函數的實現:

void* my_strcpy(void *arr, void *brr)
{
    int j = 0;
    int k = 0;
    while(brr[j] != 0)
    {
        arr[j] = brr[j];
        j++;
    }
    arr[j] = '\0';
    return arr;
}

4、strcpy和memcpy的區別:

  • 複製的內容不同,strcpy只能複製字符串,而memcpy可以複製任意內容,例如:字符數組、整型、結構體、類等
  • 複製的方法不同,strcpy不需要指定長度,它遇到被複制字符的串結束符“\0”才結束,所以容易溢出。memcpy是根據其第三個參數決定複製的長度
  • 用途不同,通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章