經典面試題 實現memcpy庫函式

2021-06-27 14:14:48 字數 1375 閱讀 2604

【題目】

已知memcpy的函式為: void* memcpy(void *dst , const void* src , size_t count)

其中dst是目的指標,src是源指標。不呼叫c++/c的memcpy庫函式,請編寫memcpy。

【解析】

1 按照ansi(american national standards institute)標準,不能對void指標進行演算法操作,

即不能對void指標進行如p++的操作,所以需要轉換為具體的型別指標來操作,例如char *

2 memcpy是對記憶體進行操作,可能遇到記憶體重疊的情況,同樣的問題存在於memmove中, 但是源**中這兩個函式的處理方式不一樣:

memcpy中dst和src中的區域不能重疊,否則會出現未知結果。函式沒做任何記憶體的處理,記憶體是否重疊由程式設計師自己控制。

memmove裡面則判斷了記憶體重疊的情況,當記憶體重疊時從後往前複製,以確保複製正常處理。

【**】

#include using namespace std;

//實現memcpy庫函式

void* memcpy(void *dst, const void *src, size_t count)

unsigned char *pdst = (unsigned char *)dst;

const unsigned char *psrc = (const unsigned char *)src;

//判斷記憶體是否重疊

bool flag1 = (pdst >= psrc && pdst < psrc + count);

bool flag2 = (psrc >= pdst && psrc < pdst + count);

if(flag1 || flag2)

unsigned char *pdst = (unsigned char *)dst;

const unsigned char *psrc = (const unsigned char *)src;

//判斷記憶體是否重疊

bool flag1 = (pdst >= psrc && pdst < psrc + count);

bool flag2 = (psrc >= pdst && psrc < pdst + count);

if(flag1 || flag2)//while

}else//while

}return dst;

}int main()

}// 倒序拷貝

else

}return pstr1;

}int main(){

char str = "hello world";

memmove(str+4,str,7);

cout<

經典面試題 memcpy實現

1說明 memcpy是記憶體拷貝的函式,給兩個位址和一定長度進行記憶體上的複製,不論什麼型別都能複製,並且有返回值 2用法char dest 20 char ss 13 hello world memcpy dest,ss,sizeof ss 3實現 不考慮記憶體覆蓋版本 void memcpy v...

經典面試題

1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...

經典面試題

我的老同學現在富得流油。他開創了乙個軟體公司,開發了一系列軟體,生意越做越大。今天他來到這個城市後馬上打 給我。是我啊!聽出來了嗎?是這樣的,我到這兒的大學招畢業生,要在這兒呆上五天,咱哥們趁這個時間好好聚一聚。我做東!既然他要做東,我理所當然順水推舟。人家是老闆,不吃白不吃!我來到他下榻的賓館,看...