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, 463.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()的比较及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典数组排序sorted_P
- 下一篇: sm总线控制器找不到驱动程序_技术 |