天天看點

memcpy,memset内部函數實作

#include<iostream>

using namespace std;

//實作,未考慮記憶體重疊情況

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)

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 + ; 
    }
    return ret;
}