淺析memcpy內存拷貝函數

   淺析memcpy函數原型

  C語言程序員鍾愛memcpy函數,面試時考官總會讓你寫一個memcpy函數,筆試時候也總有這個題目,那這究竟是爲什麼呢?要想知道這個答案,還得從頭說起。

  話說C語言誕生之初,便與硬件有着天然的聯繫,使我們不得不深入基層,瞭解內存,操作內存。就如爲將者需熟讀兵書、通曉天文、地理一樣,我們要搞清各種元素的內存形態、位置及相應的操作方法,熟悉內存操作是對C語言的基本要求,大概這就是大家鍾愛memcpy的原因吧。
閒言少敘,開始正題:

1. memcpy函數的原型

void *memcpyvoid *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函數嘍。欲知後事如何,且聽下回分解吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章