C/C++?string.h庫(kù)中memcpy()和memmove()的使用
不能把一個(gè)數(shù)組賦給另一個(gè)數(shù)組,所以要通過(guò)循環(huán)把數(shù)組中的每個(gè)元素賦給另一個(gè)數(shù)組相應(yīng)的元素。有一個(gè)例外的情況是:使用strcpy()和strncpy()函數(shù)來(lái)處理字符數(shù)組。
memcpy()和memmove()函數(shù)提供類(lèi)似的方法處理任意類(lèi)型的數(shù)組,下面是這兩個(gè)寒素的原型:
void *memcpy(void *restrict s1, const void *restrict s2, size_t n); void *memmove(void *s1, const void *s2, size_t n);
這兩個(gè)函數(shù)都從s2指向的位置拷貝n字節(jié)到s1指向的位置,而且都返回s1的值。所不同的是memcpy()的參數(shù)帶關(guān)鍵字restrict,即memcpy()假設(shè)兩個(gè)內(nèi)存區(qū)域之間沒(méi)有重疊。
而memmove()不做這樣的假設(shè),所以拷貝過(guò)程類(lèi)似于先把所有字節(jié)拷貝到一個(gè)臨時(shí)緩沖區(qū),然后再拷貝到最終目的地。
如果使用memcpy()時(shí),兩區(qū)域出現(xiàn)重疊會(huì)怎樣?其行為時(shí)未定義的。這意味著該函可能正常工作。也可能失敗。編譯器不會(huì)再本該不使用memcpy()時(shí)禁止你使用,作為程序員,再使用該函數(shù)時(shí)有責(zé)任確保兩個(gè)區(qū)域不重疊。
由于這兩個(gè)函數(shù)設(shè)計(jì)用于處理任何數(shù)據(jù)類(lèi)型,所有它們的參數(shù)都是兩個(gè)指向void的針。
C允許把任何類(lèi)型的指針賦給void*類(lèi)型的指針。如此寬容導(dǎo)致函數(shù)無(wú)法知道待拷貝據(jù)的類(lèi)型。因此這兩個(gè)函數(shù)使用第3個(gè)參數(shù)指明待拷貝的字節(jié)數(shù)。
需要注意的時(shí),對(duì)數(shù)組而言,字節(jié)數(shù)與元素的個(gè)數(shù)不同。如果要拷貝數(shù)組中10個(gè)double
類(lèi)型的元素,要使用10*sizeof(double),而不是10.
示例源碼:
// Len_memcpy.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開(kāi)始并結(jié)束。 // #include <iostream> #define SIZE 10 #include <string> using namespace std; void PrintD(string s, int* data, int len) { printf("%s\t", s.c_str()); for (int i = 0; i < len; i++) { printf("%d\t", data[i]); } printf("\n"); } void PrintD(string s, double* data, int len) { printf("%s\t", s.c_str()); for (int i = 0; i < len; i++) { printf("%.2lf\t", data[i]); } printf("\n"); } int main() { int nValues[SIZE] = { 1,2,3,4,5,6,7,8,9,10 }; double dValues[SIZE] = { 1.1, 2.2, 3.3, 4.4, 5.5,6.6,7.7,8.8,9.9, 0.1 }; int memcpyN[SIZE] = {0}; // 使用memcpy拷貝數(shù)據(jù)到這里 double memcpyD[SIZE] = {0.0}; int memmoveN[SIZE] = { 0 }; // 使用memmove拷貝數(shù)據(jù)到這里 double memmoveD[SIZE] = { 0.0 }; printf(" copy before: \n"); PrintD("Values ", nValues, SIZE); PrintD("dValues ", dValues, SIZE); PrintD("targetN ", memcpyN, SIZE); PrintD("targetD ", memcpyD, SIZE); printf("\n after memcpy copy: \n"); memcpy(memcpyN, nValues, sizeof(int)*SIZE); memcpy(memcpyD, dValues, sizeof(int)*SIZE); // double比size占位寬,這里會(huì)丟失數(shù)據(jù) PrintD("Values ", nValues, SIZE); PrintD("dValues ", dValues, SIZE); PrintD("memcpyN ", memcpyN, SIZE); PrintD("memcpyD ", memcpyD, SIZE); printf("\n after memmove copy: \n"); memcpy(memmoveN, nValues, sizeof(int)*SIZE); memcpy(memmoveD, dValues, sizeof(double)*SIZE); // 這里不會(huì)再丟失數(shù)據(jù) PrintD("Values ", nValues, SIZE); PrintD("dValues ", dValues, SIZE); PrintD("memmoveN", memmoveN, SIZE); PrintD("memmoveD", memmoveD, SIZE); }
執(zhí)行結(jié)果:
到此這篇關(guān)于C/C++ string.h庫(kù)中memcpy()和memmove()的使用的文章就介紹到這了,更多相關(guān)C++ memcpy()和memmove()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
從匯編看c++中默認(rèn)構(gòu)造函數(shù)的使用分析
c++中,如果為一個(gè)類(lèi)沒(méi)有明確定義一個(gè)構(gòu)造函數(shù),那么,編譯器就會(huì)自動(dòng)合成一個(gè)默認(rèn)的構(gòu)造函數(shù)。下面,通過(guò)匯編程序,來(lái)看一下其真實(shí)情況2013-05-05OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04C語(yǔ)言中的時(shí)間函數(shù)clock()和time()你都了解嗎
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的時(shí)間函數(shù)clock()和time(),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02Qt編寫(xiě)地圖實(shí)現(xiàn)實(shí)時(shí)動(dòng)態(tài)軌跡效果
實(shí)時(shí)動(dòng)態(tài)軌跡主要是需要在地圖上動(dòng)態(tài)顯示GPS的運(yùn)動(dòng)軌跡,也是編寫(xiě)地圖時(shí)一個(gè)重要的功能。本文將利用Qt實(shí)現(xiàn)這一功能,需要的可以參考一下2022-02-02C++ 中實(shí)現(xiàn)把EXCEL的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)(ACCESS、MSSQL等)實(shí)例代碼
這篇文章主要介紹了C++ 中實(shí)現(xiàn)把EXCEL的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)(ACCESS、MSSQL等)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,適合初學(xué)者練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)
C++編譯器會(huì)把代碼直接分為四個(gè)小區(qū),弄懂這四小區(qū)對(duì)我們理解內(nèi)存有所幫助,所以下面這篇文章主要給大家介紹了關(guān)于C++內(nèi)存四區(qū)之代碼區(qū)、全局區(qū)、棧區(qū)和堆區(qū)的相關(guān)資料,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)FTP綜合應(yīng)用詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)FTP綜合應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08