memcpy的實現


按字節(Byte)拷貝實現的memcpy

復制代碼
 1 void *my_memcpy_byte(void *dst, const void *src, int n)
 2 {
 3     if (dst == NULL || src == NULL || n <= 0)
 4         return NULL;
 5 
 6     char * pdst = (char *)dst;
 7     char * psrc = (char *)src;
 8 
 9     if (pdst > psrc && pdst < psrc + n)
10     {
11         pdst = pdst + n - 1;
12         psrc = psrc + n - 1;
13         while (n--)
14             *pdst-- = *psrc--;
15     }
16     else
17     {
18         while (n--)
19             *pdst++ = *psrc++;
20     }
21     return dst;
22 }
復制代碼

在上面按字節拷貝中考慮了拷貝覆蓋,連續的一段空間存放數據是從低地址到高地址進行存放。先從源地址讀出數據,然后寫入到目的地址空間中。目的空間的起始地址如果在源數據空間之內就會出現內存覆蓋的情況。

這種情況先從尾部拷貝,避免覆蓋數據,不過這種情況也會破壞src空間數據,src前使用了const關鍵字,也就是空間只讀,在函數內部不修改src空間數據。

而標准庫的memcpy並沒有將寫覆蓋認為是內存拷貝,而是內存移動。memcpysrc代表一塊內存空間,並用const關鍵字修飾,並不希望內存塊被破壞。

對於寫覆蓋(這里是內存塊移動)標准庫推薦使用memmove函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM