一朋友問我memcpy如何寫? 初時感到愕然,c庫中不是有嗎? 後來才知道原來是某公司考題。檢視了一下要求,呵呵,要求的已經不是原來的memcpy函式了。嘗試寫出,歡迎高手拍磚:
#define n 4
#pragma pack(n)
void *memcpyy(void* dest,const void* src,size_t n)
//判斷初始指標
assert((null != dest)&&(null != src));
if (0 == n)
if(dest == src)
//保護原指標不動
byte *pd = (byte*)dest;
const byte *ps = (const byte*)src;
size_t i,num,residue;
// 相比源指標,目標指標在低位,此時可能發生重疊,由高位到低位逆序拷貝
if (dest>src)
pd += n-1; ps += n-1;
for (i=0;iif (0 == (size_t)pd%n)
break;
*pd-- = *ps--;
pd -= 3;
ps -= 3;
num = (n-i)/n;
residue = (n-i)%n;
size_t *pdest = (size_t*)pd;
size_t *psrc = (size_t*)ps;
while(num--)
*pdest-- = *psrc-- ;
if (0 != residue)
pd = (unsigned char*)(++pdest) - 1;
ps = (const unsigned char*)(++psrc) - 1;
for (i=residue;i>0;i--)
*pd-- = *ps-- ;
// 相比源指標,目標指標在高位,此時由低位到高位順序拷貝就可
else
for (i=0;iif (0 == (size_t)pd%n)
break;
*pd++ = *ps++ ;
num = (n - i )/n;
residue = (n - i)%n;
size_t* pdest = (size_t*)pd;
size_t* psrc = (size_t*)ps;
while (num--)
*pdest++ = *psrc++ ;
if (0 != residue)
pd = (unsigned char*)pdest;
ps = (const unsigned char*)psrc;
for (i=0;i*pd++ = *ps++;
return dest;
關於strcpy與memcpy函式的位址重疊問題
大家一般認為名不見經傳strcpy函式實現不是很難,流行的strcpy函式寫法是 cpp view plain copy char my strcpy char dst,const char src 如果注意到 1,檢查指標有效性 2,返回目的指標des 3,源字串的末尾 0 需要拷貝。寫出上面實現...
memcpy函式用法
函式原型 void memcpy void dest,void src,unsigned int count memcpy 函式用於 把資源記憶體 src所指向的記憶體區域 拷貝到目標記憶體 dest所指向的記憶體區域 size變數控制拷貝的位元組數 用法 1 可以拷貝任何型別的物件,因為函式的引數...
memcpy函式介紹
原型 extern void memcpy void dest,void src,unsigned int count 用法 include 功能 由src所指記憶體區域複製count個位元組到dest所指記憶體區域。說明 src和dest所指記憶體區域不能重疊,函式返回指向dest的指標。舉例 m...