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;
}