memcpy,memset內部函數實現

#include
using namespace std;
/*
memcpy函數用於資源內存(src指向的內存)拷貝到目標內存(desc指向的內存);拷貝的個數size
用法::(1)可以拷貝任何類型的對象,因爲函數的參數類型是void* ,由於函數拷貝是一個字節一個
      字節拷貝,實際操作是將void*強制轉換成了char*,這樣才能保證每一次加一個指針
*/


//實現,未考慮內存重疊情況
void* memcpy1(void * desc, const void * src, size_t size)
{
if (desc == NULL && src == NULL)
{
return NULL;
}
unsigned char* desc1 = (unsigned char*)desc; //將void*轉成unsigned char*類型
unsigned char* src1 = (unsigned char*)src;   //將void*轉成unsigned char*類型


while (size-->0)
{
*desc1++ = *src1++;
}
return desc;  
}


//考慮內存重疊的情況
void* memcpy2(void* desc, const void * src, size_t size)
{
if(desc == NULL && src == NULL)
{
return NULL;
}
unsigned char* desc1 = (unsigned char*)desc;
unsigned char* src1 = (unsigned char*)src;
//當內存重疊時,從後往前複製
if(desc > src && desc1 < (src1 + size))//內存發生重疊

for (int i = size - 1; i >= 0; i--)
{
*desc1++ = *src1++;
}
}
else
{
for (int i = 0; i < size; i++)
{
*desc1++ = *src1++;
}
}
return desc;
}


//memset內部實現memset(void*s,int ch,size_t n)
/*將s所指向的某一塊內存中的前n個字節的內容全部設置爲ch指定的ASCII值,返回s*/
void * memset1(void * ptr, int value, size_t n)
{
if (ptr == NULL && n < 0)
{
cout << "賦值出現錯誤" << endl;
return;
}
char *s = (char*)ptr; //定義一個指針來接str;輔助指針
while (n--)
{
*s++ = (char)value;
}
return ptr;

}

下面就是根據源碼而來的memset實現:

void* memset(void* dst,int val, size_t count)
{
    void* ret = dst;
    while(count--)
    {
        *(char*)dst = (char)val;
        dst = (char*)dst + 1; 
    }
    return ret;
}

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