日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

memcpy 头文件_C|memcpy()和memmove()的比较及实现

發布時間:2025/3/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 memcpy 头文件_C|memcpy()和memmove()的比较及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

memcpy()和memmove()函數的原型如下:

void * memcpy ( void * dst, const void * src, size_t num );

void * memmove ( void * dst, const void * src, size_t num );

1 相同點

1.1 通常函數的參數都有具體的類型,而這里的兩個函數的參數和返回值都是void,其實就是內存塊(字節序列)的復制或移動(函數名字的mem是memory的縮寫),有點泛型的味道,不像字符串拷貝函數,指定的是C風格字符數組類型。

1.2 兩者都位于頭文件中,當然除了字符串的復制,也可以復制其它數據類型,例如整體復制一個結構體(見后面的例子)。

1.3 函數不檢查源中是否有任何終止的空字符(terminating null character),它總是精確地復制num字節。

1.4 為了避免溢出(overflows),目標參數和源參數指向的空間至少應為num字節。

2 區別

memcpy():復制內存塊(Copy block of memory),直接復制(directly copy),因為是直接復制,所以不應重疊(overlap),對于重疊的內存塊,memmove是一種更安全的方法。

memmove():移動內存塊(Move block of memory),復制就像使用了中間緩沖區(intermediate buffer)一樣進行(其實質是比較兩塊內存的首地址,進行前向或后向復制(移動一下兩個指針)),允許目標和源重疊。

3 使用實例

3.1 memcpy():

#include #include struct { char name[40]; int age;} person, person_copy;int main (){ char myname[] = "Pierre de Fermat"; /* using memcpy to copy string: */ memcpy ( person.name, myname, strlen(myname)+1 ); person.age = 46; /* using memcpy to copy structure: */ memcpy ( &person_copy, &person, sizeof(person) ); printf ("person_copy: %s, %d ", person_copy.name, person_copy.age ); return 0;}// Output: person_copy: Pierre de Fermat, 46

3.2 memmove():

/* memmove example */#include #include int main (){ char str[] = "memmove can be very useful......"; memmove (str+20,str+15,11); puts (str); return 0;}// Output:memmove can be very very useful.

4 memmove()的實現

memmove()函數原型:void *memmove(void *dest, const void *src, size_t n)。

其功能是拷貝src所指向內存內容前n個字節到dest所指的地址上。

由于數據類型不確定,可以以字符為單位進行拷貝,這是因為字符可以擴展為任何一種數據類型,且每一種數據類型大小都是字符大小的倍數。

考慮到兩塊內存重疊的情況,需要考慮以下三點:

(1)當目標內存的首地址等于源內存的首地址時,不進行任何拷貝;

(2)當目標內存的首地址小于源內存的首地址時,正向拷貝,即從src拷貝到src + n;

(3)當目標內存的首地址大于源內存的首地址時,移動指針,反向拷貝,即從src+n反向拷貝到src;

#include#include#includevoid* memmove(void* dst, const void* src, size_t n){ char* d = (char*)dst; // 按字節為單位進行操作 const char *s = (const char*)src; if (ds) // 當目標地址在源地址后面時,移動指針,反向拷貝 { d = d+n-1; s = s+n-1; while (n--)*d-- = *s--; } return dst;}int main(){char src[100] = "Hello World!";memmove(src + 4, src, strlen(src) + 1);printf("%s",src); system("pause");return 0;}// 輸出:HellHello World!

-End-

總結

以上是生活随笔為你收集整理的memcpy 头文件_C|memcpy()和memmove()的比较及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。