国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

關于memcpy和memmove的一點重要說明

2020-01-26 14:20:49
字體:
來源:轉載
供稿:網友

今天看到書上降到memcpy和memmove的區別才突然發現原來兩者之間有如此區別,以前只知道這兩個函數是

實現同樣的功能,沒有接觸到其不同。

memcpy和memmove在MSDN的定義如下:

從兩者的聲明來看的確沒有區別,我們來看這樣一個例子

當我們需要將char* src="abcde"這個字符串全部copy到dest中然而src與dest在內存中大概是這樣存在的:

內存地址   低------>高

src   dest1  2  3  4  5   6[ a ][ b ][ c ][ d ][ e ][ '/0' ][ ][ ][ ][ ][ ][ ][ ]

src地址為內存1,目的地址為內存2此時很明顯內存出現了重疊,當我們拷貝字符a到第三個內存位置的時

a將覆蓋src內存中的第三個字符 這種情況在memcpy未定義然而memmove卻給出了正確的處理方式

解決方法,試想當我們先將dest地址移動dest+n-1同時src地址移動src+n-1這樣再從src的最后一個元素開

始逐個向前拷貝到dest中就完美的避免了內存重疊導致的元素覆蓋問題呢

下面我們根據memcpy和memmove給出自己的實現:

#include <iostream>using namespace std;void *memcopy( void *dest, const void *src, size_t count ){  if(dest==NULL||src==NULL)    return NULL;  char* Dest=(char*)dest;  const char* Src=(char*)src;    int i=0;    while(i<count)  {    *Dest++=*Src++;    i++;  }    return dest;}void *memmove(void *dest,const void *src,size_t count ){  if(dest==NULL||src==NULL)    return NULL;  char* Dest=(char*)dest;  const char* Src=(char*)src;    int i=0;  if(src>dest)  {    while(i<count)//正向拷貝    {      *Dest++=*Src++;      i++;    }  }  else  {    Dest=Dest+count-1;//反向拷貝    Src=Src+count-1;    while(i<count)    {      *Dest--=*Src--;      i--;    }  }      return dest;}void main(){  char dest[80];  memset(dest,'/0',80);  char* src="memcpyteststring";  int n;  cout<<"How many char you want to copy from src to dest(memcpy): ";  cin>>n;  cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;  cout<<"How many char you want to copy from src to dest(memcpy): ";  cin>>n;  cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;  return;}

運行截圖:

以上就是小編為大家帶來的關于memcpy和memmove的一點重要說明全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 咸阳市| 湖北省| 什邡市| 金坛市| 怀安县| 凤山市| 新干县| 宁晋县| 晋城| 海原县| 景谷| 互助| 北辰区| 信宜市| 津南区| 浪卡子县| 天祝| 房产| 虹口区| 黑龙江省| 鄂托克旗| 运城市| 诸暨市| 桃源县| 乐安县| 鹤庆县| 卢氏县| 五台县| 荔波县| 抚州市| 堆龙德庆县| 通州区| 峨山| 红河县| 合水县| 兰溪市| 正宁县| 深泽县| 黄山市| 华池县| 玉田县|