深入理解memmove()與memcpy()的區(qū)別以及實(shí)現(xiàn)方法

代碼如下所示:
// MemMove.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
void* memmove(void* dest, const void* src, size_t n)
{
if (n <= 0)
{
cout << "Invalid count number." << endl;
}
if (dest == NULL || src == NULL)
{
cout << "The dest or src address is null." << endl;
}
if (dest == src)
{
cout << "The dest equals src." << endl;
}
if ((char*)dest <= (char*)src || (char*)dest >= (char*)src + n)
{//對(duì)應(yīng)圖中2,3,4三種情況,賦值過(guò)程中,src中未使用的不會(huì)被覆蓋
char* de = (char*)dest;
const char* sr = (const char*)src;
while (n--)
{
*de++ = *sr++;
}
}
else
{//對(duì)應(yīng)圖中的第一種情況
char* de = (char*)dest + n -1;
const char* sr = (const char*)src + n - 1;
while (n--)
{
*de-- = *sr--;
}
}
return dest;
}
void* memmcpy(void* dest, const void* src, size_t n)
{
if (n <= 0)
{
cout << "Invalid count number." << endl;
}
if (dest == NULL || src == NULL)
{
cout << "The dest or src address is null." << endl;
}
if (dest == src)
{
cout << "The dest equals src." << endl;
}
char* de = (char*)dest;
const char* sr = (const char*)src;
while (n--)
{
*de++ = *sr++;
}
return dest;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* p = "hello,world";
char dest[12] = {0};
char *q = (char*)memmove(dest,p,5);
cout << dest << endl;
cout << q << endl;
return 0;
}
相關(guān)文章
CreateThread()與beginthread()的區(qū)別詳細(xì)解析
很多開(kāi)發(fā)者不清楚這兩者之間的關(guān)系,他們隨意選一個(gè)函數(shù)來(lái)用,發(fā)現(xiàn)也沒(méi)有什么大問(wèn)題,于是就忙于解決更為緊迫的任務(wù)去了。等到有一天忽然發(fā)現(xiàn)一個(gè)程序運(yùn)行時(shí)間很長(zhǎng)的時(shí)候會(huì)有細(xì)微的內(nèi)存泄露,開(kāi)發(fā)者絕對(duì)不會(huì)想到是因?yàn)檫@兩套函數(shù)用混的結(jié)果2013-09-09C語(yǔ)言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)
C語(yǔ)言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ(yǔ)法檢查并不象其它高級(jí)語(yǔ)言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來(lái)了許多不便,尤其對(duì)初學(xué)C語(yǔ)言的人來(lái)說(shuō),經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤2013-07-07C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存分配函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的動(dòng)態(tài)內(nèi)存分配及動(dòng)態(tài)內(nèi)存分配函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C++實(shí)現(xiàn)AVL樹(shù)的基本操作指南
AVL樹(shù)是高度平衡的而二叉樹(shù),它的特點(diǎn)是AVL樹(shù)中任何節(jié)點(diǎn)的兩個(gè)子樹(shù)的高度最大差別為1,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)AVL樹(shù)的相關(guān)資料,需要的朋友可以參考下2022-01-01C語(yǔ)言動(dòng)態(tài)數(shù)組的使用實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)數(shù)組的使用實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)的使用
本文主要介紹了C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系
下面小編就為大家?guī)?lái)一篇淺談帶緩沖I/O 和不帶緩沖I/O的區(qū)別與聯(lián)系。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷方式,具有一定的知識(shí)性參考價(jià)值,需要的小伙伴可以先看一下2022-02-02詳解如何從Matlab中導(dǎo)出清晰的結(jié)果圖片
寫(xiě)文章的時(shí)候有時(shí)需要matlab導(dǎo)出清晰的圖片,如果直接用figure里面的保存的話(huà)不夠清晰,下面這篇文章主要給大家介紹了關(guān)于如何從Matlab中導(dǎo)出清晰的結(jié)果圖片的相關(guān)資料,需要的朋友可以參考下2022-06-06