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