算法-memcopy與memmove的區別

memcpy()和 memmove()都是C語言中的庫函數,在頭文件string.h中,做用是拷貝必定長度的內存的內容,原型以下函數

void *memcpy(void *dst, const void *src, size_t count);spa

描述:
        memcpy()函數從src內存中拷貝n個字節到dest內存區域,可是源和目的的內存區域不能重疊。
返回值:
        memcpy()函數返回指向dest的指針。指針


void *memmove(void *dst, const void *src, size_t count);code

描述:
       memmove() 函數從src內存中拷貝n個字節到dest內存區域,可是源和目的的內存能夠重疊。
返回值:
        memmove函數返回一個指向dest的指針。blog

他們的做用是同樣的,惟一的區別是,當內存發生局部重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。內存

 

下面來寫 memmove()函數如何實現原型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>


char * memcopy(char *source, char *destinatin, int count)
{
    if (source == NULL || destinatin == NULL || count <= 0)
    {
        return 0;
    }
    char *sou_index = source;
    char *des_index = destinatin;
    if (des_index < sou_index &&  des_index + count > sou_index)
    {
        sou_index = source + count;
        des_index = destinatin + count;
        while (count--)
        {
            *sou_index-- = *des_index--;
        }
    }
    else {
        while (count--)
        {
            *sou_index++ = *des_index++;
        }
    }
    return source;
}

int main()
{
    char a[] = "i am a teacher";
    char b[50] = {0};
    int len;
    len = sizeof(a);
    printf("%s", memcopy(b, a, len));
}

memcopy沒有考慮內存重疊的狀況,直接將上面的if語句裏面的內容去掉就說memcopy的函數string

相關文章
相關標籤/搜索