memcpy 头文件_C|memcpy()和memmove()的比较及实现
memcpy()和memmove()函數(shù)的原型如下:
void * memcpy ( void * dst, const void * src, size_t num );
void * memmove ( void * dst, const void * src, size_t num );
1 相同點
1.1 通常函數(shù)的參數(shù)都有具體的類型,而這里的兩個函數(shù)的參數(shù)和返回值都是void,其實就是內(nèi)存塊(字節(jié)序列)的復(fù)制或移動(函數(shù)名字的mem是memory的縮寫),有點泛型的味道,不像字符串拷貝函數(shù),指定的是C風(fēng)格字符數(shù)組類型。
1.2 兩者都位于頭文件中,當(dāng)然除了字符串的復(fù)制,也可以復(fù)制其它數(shù)據(jù)類型,例如整體復(fù)制一個結(jié)構(gòu)體(見后面的例子)。
1.3 函數(shù)不檢查源中是否有任何終止的空字符(terminating null character),它總是精確地復(fù)制num字節(jié)。
1.4 為了避免溢出(overflows),目標參數(shù)和源參數(shù)指向的空間至少應(yīng)為num字節(jié)。
2 區(qū)別
memcpy():復(fù)制內(nèi)存塊(Copy block of memory),直接復(fù)制(directly copy),因為是直接復(fù)制,所以不應(yīng)重疊(overlap),對于重疊的內(nèi)存塊,memmove是一種更安全的方法。
memmove():移動內(nèi)存塊(Move block of memory),復(fù)制就像使用了中間緩沖區(qū)(intermediate buffer)一樣進行(其實質(zhì)是比較兩塊內(nèi)存的首地址,進行前向或后向復(fù)制(移動一下兩個指針)),允許目標和源重疊。
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()的實現(xiàn)
memmove()函數(shù)原型:void *memmove(void *dest, const void *src, size_t n)。
其功能是拷貝src所指向內(nèi)存內(nèi)容前n個字節(jié)到dest所指的地址上。
由于數(shù)據(jù)類型不確定,可以以字符為單位進行拷貝,這是因為字符可以擴展為任何一種數(shù)據(jù)類型,且每一種數(shù)據(jù)類型大小都是字符大小的倍數(shù)。
考慮到兩塊內(nèi)存重疊的情況,需要考慮以下三點:
(1)當(dāng)目標內(nèi)存的首地址等于源內(nèi)存的首地址時,不進行任何拷貝;
(2)當(dāng)目標內(nèi)存的首地址小于源內(nèi)存的首地址時,正向拷貝,即從src拷貝到src + n;
(3)當(dāng)目標內(nèi)存的首地址大于源內(nèi)存的首地址時,移動指針,反向拷貝,即從src+n反向拷貝到src;
#include#include#includevoid* memmove(void* dst, const void* src, size_t n){ char* d = (char*)dst; // 按字節(jié)為單位進行操作 const char *s = (const char*)src; if (ds) // 當(dāng)目標地址在源地址后面時,移動指針,反向拷貝 { 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-
總結(jié)
以上是生活随笔為你收集整理的memcpy 头文件_C|memcpy()和memmove()的比较及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字典数组排序sorted_P
- 下一篇: sm总线控制器找不到驱动程序_技术 |