淺析memcpy函數原型
C語言程序員鍾愛memcpy函數,面試時考官總會讓你寫一個memcpy函數,筆試時候也總有這個題目,那這究竟是爲什麼呢?要想知道這個答案,還得從頭說起。
話說C語言誕生之初,便與硬件有着天然的聯繫,使我們不得不深入基層,瞭解內存,操作內存。就如爲將者需熟讀兵書、通曉天文、地理一樣,我們要搞清各種元素的內存形態、位置及相應的操作方法,熟悉內存操作是對C語言的基本要求,大概這就是大家鍾愛memcpy的原因吧。
閒言少敘,開始正題:1. memcpy函數的原型
void *memcpy(void *dest,void *src,unsigned int size)
乍一看到處是指針,還挺唬人,實際呢,就是幾個地址啦:
1. dest–>目標內存首地址
2. src–>源內存首地址
3. size–>拷貝內存的字節數量
4. 返回值–>目標內存首地址或者NULL
說起地址,當然得明白該地址所指內存以什麼形式組織的啦,那簡單啦,int型4個字節一存,char型1個字節一存,結構體根據具體結構排布內存。這就是void存在的意義嘍,void能代表以上所有類型內存嘍。但size是指字節卻亙古不變哦,啊,爲什麼?2. memcpy函數的實現
前面講到size必須不能改變爲字節數,其實啊,C語言裏面內存操作的基本單元就是字節啊,不論是int、字符串還是結構體,都是以字節爲最小單位,所以不論任何形勢的內存拷貝,就一個字節一個字節的搬運,保證沒問題的啦。
void *memcpy(void *dest,void *src,unsigned intsize) { char *d=(char *)dest;//以字節形式來操作嘍,字節是內存操作最小單元 char *s=(char*)src; //把源地址轉到以字節爲單位的字節指針中 if(d==NULL||s==NULL||size<0) returnNULL; //地址是否爲空 while(size--) *d++=*s++; //搬運開始吧,一個一個來 return dest; // 返回目標內存地址 }
3. 關於memcpy的一點思考
memcpy應用比較靈活,不限制類型,他是void型的,各種類型都可以拷貝。但須注意他的拷貝方式,一個字節一個字節的搬運,這就導致有內存重疊的可能啊,如果是整體搬運,那就不需考慮了。話說memcpy沒有測地解決內存重疊的問題,那這個問題留給了誰呢?猜猜看,那就是memmove函數嘍。欲知後事如何,且聽下回分解吧。