memcpy,memmove的實現
1.memcpy()的實現
函式原型:
char *memcpy(void * destination,const void * source,size_t num)
- 記憶體拷貝函式,從source的位置開始向後拷貝num個位元組的資料到dest的記憶體位置。
- memcpy按位元組拷貝,並不是只能拷貝字串,所以沒有‘\0’結束標誌(遇到‘/0’不會停止),按指定是位元組數大小拷貝
- str家族函式只能處理字串型別的資料,而mem可以處理任意型別的資料
- 如果source和destination有任何重疊,複製的結果都是未定義的
void* my_memcpy(void * dest, void * src, size_t count)
{
assert(dest);
assert(src);
char* p = (char *)dest;
char* q = (char *)src;
while (count--)
{
*p = *q;
p++;
q++;
}
return dest;
}
//void變數 不能被定義,因為編譯器不知道它的大小,但是void*變數可以被定義出來,因為它是個指標,可以接受任意型別的指標
memcpy函式在拷貝的時候可能出現記憶體重疊問題,導致結果與預期的不一樣。此時就可以使用memmove()解決
memcpy從前向後拷貝,本來我們想要的結果是“hello worl”,但是它的第一個h拷過去以後,之後拷貝的都是h,如果用memmove拷貝他會從後向前拷貝從而解決記憶體重疊問題
2.memmove()的實現
函式原型:
voi * memmove(void * destination,const void * source,size_t num)
- 它也是記憶體拷貝函式,與memcpy的差別在於他可以解決記憶體重疊問題
- 如果原空間和目標空間出現重疊,就使用memmove函式處理
void* memmove(void *dest, void *src, size_t count)
{
void * ret = dest;
if (dest <= src || (char*)dest >= ((char*)src + count))
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return(ret);
}
相關文章
- memmove和memcpy函式的區別及實現memcpy函式
- memmove和memcpy 以及strcmp strcpy幾個庫函式的實現memcpy函式
- strcpy,strncpy,memcpy,memmove,memset函式memcpy函式
- [C++]實現memcpyC++memcpy
- 實現c中memcpy函式memcpy函式
- [C練習]實現memcpy原型函式memcpy原型函式
- C語言-記憶體函式的實現(二)之memmoveC語言記憶體函式
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- memcpymemcpy
- strcpy與memcpy的區別memcpy
- memset()&&memcpy&&strcpymemcpy
- strcpy函式和memcpy函式的區別函式memcpy
- C中memcpy使用注意事項memcpy
- C 標準庫 – string.h之memmove使用
- ORA-7445(_intel_fast_memcpy.A)錯誤IntelASTmemcpy
- 關於使用向量指令集對memcpy最佳化的分析memcpy
- memcopy 導致的程式碼崩潰問題,memcpy的三大踩坑記memcpy
- 寫程式是一種態度(二)四倍速memmove (轉)
- 比memcpy還要快的記憶體複製,老哥瞭解一下?memcpy記憶體
- ORA-07445: exception encountered: core dump [__intel_new_memcpy()+5424]ExceptionIntelmemcpy
- AutoreleasePool的實現
- EventBus的實現
- Blocks的實現BloC
- ReactRouter的實現React
- map的實現
- 堆的實現
- siri的實現
- job的實現
- Servlet的實現Servlet
- Oracle內部錯誤:ORA-07445[_memcpy()+52] [SIGSEGV]一例OraclememcpyGse
- 訊息的即時推送——net實現、websocket實現以及socket.io實現Web
- 簡易 Vue 評論框架的實現————父元件的實現Vue框架元件
- 從零實現Vue的元件庫(十六)- Dropdown 實現Vue元件
- 虛擬現實還需要多久才能真正的實現
- 從零實現Vue的元件庫(十二)- Table 實現Vue元件
- 從零實現Vue的元件庫(一)- Toast 實現Vue元件AST
- 從零實現Vue的元件庫(九)- InputNumber 實現Vue元件
- 從零實現Vue的元件庫(八)- Input 實現Vue元件