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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

memmove、memcpy和mem**y三個函數(shù)都是內存的拷貝,從一個緩沖區(qū)拷貝到另一個緩沖區(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ù)說明:memcpy()用來拷貝src所指的內存內容前n個字節(jié)到dest所指的內存地址上。與strcpy()不同的是,memcpy()會完整的復制n個字節(jié),不會因為遇到字符串結束'/0'而結束返回值:返回指向dest的指針表頭文件:#include<string.h>定義函數(shù):void*mem**y(void*dest,constvoid*src,intc,size_tn);函數(shù)說明:mem**y()用來拷貝src所指的內存內容前n個字節(jié)到dest所指的地址上。與memcpy()不同的是,mem**y()如果在src中遇到某個特定值(intc)立即停止復制。返回值:返回指向dest中值為c的下一個字節(jié)指針。返回值為0表示在src所指內存前n個字節(jié)中沒有值為c的字節(jié)。表頭文件:#include<string.h>定義函數(shù):void*memmove(void*dest,constvoid*src,size_tn);函數(shù)說明:memmove()是從一個緩沖區(qū)移動到另一個緩沖區(qū)中。返回值:返回指向dest指針。當dest<=src-count或dest>=src+count時,以上三個函數(shù)均不會產(chǎn)生覆蓋問題,即源數(shù)據(jù)不會被更改。若不在以上范圍內,則源數(shù)據(jù)會被更改。如: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ù)會發(fā)現(xiàn)b中數(shù)據(jù)輸出已被更改。發(fā)現(xiàn)即使a數(shù)組指向的空間不夠存儲數(shù)據(jù),也能夠移動成功。原因|dest-src|<count如果在使用這些函數(shù)時,分配給足夠的空間,然后再使用就不會出現(xiàn)覆蓋問題。也就是說如果外部分配給的空間不足以存儲要拷貝的數(shù)據(jù)時,就有可能出現(xiàn)源數(shù)據(jù)被覆蓋更改的問題。#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);}觀察輸出結果。把memmove(p,a,sizeof(a));改為memcpy(p,a,sizeof(a));或mem**y(p,a,'e',sizeof(a));再觀察輸出結果??梢钥闯鲈谀康拇鎯臻g不足時,便會出現(xiàn)源數(shù)據(jù)被覆蓋改變的問題。如果目的存儲空間分配足夠的空間,則便不會出現(xiàn)覆蓋問題。memcpy()、memmove()、memset()的實現(xiàn)void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize)與strcpy相比,memcpy并不是遇到'/0'就結束,而是一定會拷貝完n個字節(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個字節(jié)拷貝到dest指向的前n個內存區(qū)域中可能出現(xiàn)dest和scr內存重疊的情況,都進行了很好的處理,這也是和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指向的內存區(qū)域的前n個字節(jié).返回指向該內存區(qū)域的指針s.s并不一定是指向字符的指針,以是指向任何類型的指針,甚至可以是指向結構的指針.viewplaincopy

溫馨提示

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

評論

0/150

提交評論