mem系列函數(shù)實(shí)現(xiàn)_第1頁(yè)
mem系列函數(shù)實(shí)現(xiàn)_第2頁(yè)
mem系列函數(shù)實(shí)現(xiàn)_第3頁(yè)
mem系列函數(shù)實(shí)現(xiàn)_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

memmove、memcpy和mem**y三個(gè)函數(shù)都是內(nèi)存的拷貝,從一個(gè)緩沖區(qū)拷貝到另一個(gè)緩沖區(qū)。memmove(void*dest,void*src,intcount)memcpy(void*dest,void*src,intcount)mem**y(void*dest,void*src,intch,intcount)表頭文件:#include<string.h>定義函數(shù):void*memcpy(void*dest,constvoid*src,size_tn)函數(shù)說(shuō)明:memcpy()用來(lái)拷貝src所指的內(nèi)存內(nèi)容前n個(gè)字節(jié)到dest所指的內(nèi)存地址上。與strcpy()不同的是,memcpy()會(huì)完整的復(fù)制n個(gè)字節(jié),不會(huì)因?yàn)橛龅阶址Y(jié)束'/0'而結(jié)束返回值:返回指向dest的指針表頭文件:#include<string.h>定義函數(shù):void*mem**y(void*dest,constvoid*src,intc,size_tn);函數(shù)說(shuō)明:mem**y()用來(lái)拷貝src所指的內(nèi)存內(nèi)容前n個(gè)字節(jié)到dest所指的地址上。與memcpy()不同的是,mem**y()如果在src中遇到某個(gè)特定值(intc)立即停止復(fù)制。返回值:返回指向dest中值為c的下一個(gè)字節(jié)指針。返回值為0表示在src所指內(nèi)存前n個(gè)字節(jié)中沒(méi)有值為c的字節(jié)。表頭文件:#include<string.h>定義函數(shù):void*memmove(void*dest,constvoid*src,size_tn);函數(shù)說(shuō)明:memmove()是從一個(gè)緩沖區(qū)移動(dòng)到另一個(gè)緩沖區(qū)中。返回值:返回指向dest指針。當(dāng)dest<=src-count或dest>=src+count時(shí),以上三個(gè)函數(shù)均不會(huì)產(chǎn)生覆蓋問(wèn)題,即源數(shù)據(jù)不會(huì)被更改。若不在以上范圍內(nèi),則源數(shù)據(jù)會(huì)被更改。如:chara[]={'a','b'};charb[]={'c','d','e','f','g','h'};memmove(a,b,sizeof(b));或是直接char*p=b+2;memmove(p,b,sizeof(b));輸出數(shù)據(jù)會(huì)發(fā)現(xiàn)b中數(shù)據(jù)輸出已被更改。發(fā)現(xiàn)即使a數(shù)組指向的空間不夠存儲(chǔ)數(shù)據(jù),也能夠移動(dòng)成功。原因|dest-src|<count如果在使用這些函數(shù)時(shí),分配給足夠的空間,然后再使用就不會(huì)出現(xiàn)覆蓋問(wèn)題。也就是說(shuō)如果外部分配給的空間不足以存儲(chǔ)要拷貝的數(shù)據(jù)時(shí),就有可能出現(xiàn)源數(shù)據(jù)被覆蓋更改的問(wèn)題。#include<stdio.h>#include<stdlib.h>#include<string.h>voidmain(void){inti=0;chara[9]={'a','b','c','d','e','f','g','h','/0'};charp[2]={'q','w'};//或char*p=a+2;memmove(p,a,sizeof(a));puts(a);printf("_____________________________________________/n");puts(p);printf("_____________________________________________/n");for(i=0;i<10;i++)printf("%c%d/n",*(a+i),a+i);printf("_____________________________________________/n");for(i=0;i<8;i++)printf("%c%d/n",*(p+i),p+i);}觀察輸出結(jié)果。把memmove(p,a,sizeof(a));改為memcpy(p,a,sizeof(a));或mem**y(p,a,'e',sizeof(a));再觀察輸出結(jié)果。可以看出在目的存儲(chǔ)空間不足時(shí),便會(huì)出現(xiàn)源數(shù)據(jù)被覆蓋改變的問(wèn)題。如果目的存儲(chǔ)空間分配足夠的空間,則便不會(huì)出現(xiàn)覆蓋問(wèn)題。memcpy()、memmove()、memset()的實(shí)現(xiàn)void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)與strcpy相比,memcpy并不是遇到'/0'就結(jié)束,而是一定會(huì)拷貝完n個(gè)字節(jié)。viewplaincopytoclipboardprint?void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){assert((pvTo!=NULL)&&(pvFrom!=NULL));//使用斷言byte*pbTo=(byte*)pvTo;//防止改變pvTo的地址byte*pbFrom=(byte*)pvFrom;//防止改變pvFrom的地址while(size-->0)pbTo++=*pbFrom++;returnpvTo;}void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize){assert((pvTo!=NULL)&&(pvFrom!=NULL));//使用斷言byte*pbTo=(byte*)pvTo;//防止改變pvTo的地址byte*pbFrom=(byte*)pvFrom;//防止改變pvFrom的地址while(size-->0)pbTo++=*pbFrom++;returnpvTo;}memmove()功能將指針src指向的前n個(gè)字節(jié)拷貝到dest指向的前n個(gè)內(nèi)存區(qū)域中可能出現(xiàn)dest和scr內(nèi)存重疊的情況,都進(jìn)行了很好的處理,這也是和mencpy()的區(qū)別之處viewplaincopytoclipboardprint?vord*memmove(void*dest,constvoid*src,size_tcount){void*ret=dest;if(dest<=src||dest>=src+count){while(count--)dest++=*src++}else{dest+=count-1;src+=count-1;while(count--)dest--=*src--}returnret;}vord*memmove(void*dest,constvoid*src,size_tcount){void*ret=dest;if(dest<=src||dest>=src+count){while(count--)dest++=*src++}else{dest+=count-1;src+=count-1;while(count--)dest--=*src--}returnret;}void*memset(void*s,intc,intn)用c填充由指針s指向的內(nèi)存區(qū)域的前n個(gè)字節(jié).返回指向該內(nèi)存區(qū)域的指針s.s并不一定是指向字符的指針,以是指向任何類型的指針,甚至可以是指向結(jié)構(gòu)的指針.viewplaincopy

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論