【C語言】memcpy和memmove模擬實現
阿新 • • 發佈:2021-02-18
技術標籤:c語言
標頭檔案:string.h
memcpy
void * memcpy( void * dest, const void * src, size_t num )
功能:函式memcpy從source的位置開始向後複製num個位元組的資料到destination的記憶體位置。
返回值:返回dest。
- 這個函式在遇到 ‘\0’ 的時候並不會停下來
- 如果source和destination有任何的重疊,複製的結果都是未定義的
模擬實現
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, unsigned int num)//傳入資料可能是各種型別的,所以用void*接收
{
//斷言,判斷指標的有效性,防止野指標
assert(dest!=NULL);
assert(src!=NULL);
//void*
//可以接收所有型別的指標
//不可以進行解引用和加減整數的操作,但可以比較大小
void* tmp = dest;
while (num--)
{
//把指標型別轉化為char*在解引用和+1/-1時可以訪問一個位元組
*(char*)dest = *(char*)src;
((char*)dest)++ ;
((char*)src)++;
}
return tmp;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "123456";
printf("arr1=%s\n", (char*)my_memcpy(arr1, arr2, 3));//把arr2的前三個位元組內容拷貝到arr1裡
return 0;
}
memmove
void * memmove( void * dest, const void * src, size_t num )
功能: 函式memmove從source的位置開始向後複製num個位元組的資料到destination的記憶體位置
返回值: 返回dest
- 和memcpy的差別就是memmove函式處理的源記憶體塊和目標記憶體塊是可以重疊的。
- 如果源空間和目標空間出現重疊,就得使用memmove函式處理。
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, unsigned int num)
{
//斷言,判斷指標的有效性,防止野指標
assert(dest != NULL);
assert(src != NULL);
//對於重疊拷貝
//若dest<src,src從前向後拷貝
//若dest>=src&&dest<=src+num,src從後向前拷貝
//若dest>src,src從前和從後都可以拷貝
void* tmp = dest;
while (num--)
{
if (dest < src)//從前向後拷貝
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
else//從後向前拷貝
{
*((char*)dest + num) = *((char*)src + num);
--(char*)dest;
--(char*)src;
}
}
return tmp;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int n = sizeof arr/sizeof arr[0];
int* ret=(int*)(my_memmove(arr, arr + 2, 20));//把34567拷貝到12345上
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", *ret);
ret++;
}
return 0;
}