memcpy記憶體重疊的解決

2021-09-05 08:45:57 字數 2184 閱讀 6325

在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。

memmove函式對記憶體重疊做了處理。

現在來看函式strcpy

原型:extern char *strcpy(char *dest,char *source);

功能:把source所指由null結束的字串複製到dest所指的陣列中。

說明:source和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納source的字串。

返回指向dest的指標。

重疊從兩方面考慮:

例如:針對第一種交叉情況情況,dstsrc,memcpy和memmove的結果是一樣的。請看下面的例子講解:

string s = "hello world";

memmove(&s[0],&s[5],10);

舉個記憶體重疊環境的例子:

int main()

2.下面來看下memcpy函式的原型寫法:記憶體拷貝

void *memcpy(void *dest, const void *source, size_t count)

3.下面來看下memmove函式的原型寫法:

void *memmove(void *dest, const void *source, size_t count)

它們都是從src所指向的記憶體中複製count個位元組到dst所指記憶體中,並返回dst的值。當源記憶體區域和目標記憶體區域無交叉時,兩者的結果都是一樣的。但有交叉時不一樣。源記憶體和目標記憶體交叉的情況有以下兩種:(左邊為低位址)

即:dst<=src 且 dst+count>src

針對第一種交叉情況情況,dst<=src且dst+count>src,memcpy和memmove的結果是一樣的。請看下面的例子講解:

int a = ;

memcpy(a, a+4, sizeof(int)*6);和

memmove(a, a+4, sizeof(int)*6);結果一樣,都是:4567896789

針對第二種情況,srcdst,memcpy和memmove的結果是不一樣的。請看下面的例子:

int a = ;

memcpy(a+4, a, sizeof(int)*6) 結果按照分析應該是:0123012301

但是在vs2005上執行卻是:0123012345(有知道的,請告訴我原因)

memmove(a+4, a, sizeof(int)*6) 結果是:0123012345

總結:1. 當 src 和 dest 所指記憶體區有重疊時,memmove 相對 memcpy 能提供保證:保證能將 src 所指記憶體區的前 n 個位元組正確的拷貝到 dest 所指記憶體中;

2. 當 src 位址比 dest 位址低時,兩者結果一樣。換句話說,memmove 與 memcpy 的區別僅僅體現在 dest 的頭部和 src 的尾部有重疊的情況下;

綜上所述在進行記憶體重疊的考慮時,strcpy,memcpy都要做乙個記憶體重疊的判斷:

source和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納source的字串。

返回指向dest的指標。

int count = strlen(src) + 1;//src length

assert (dest(src+count))

考慮了記憶體重疊的記憶體拷貝函式 memcpy ,相當於memmove

考慮記憶體重疊的字串拷貝函式strcpy

char * strcpy(char *dest, const char *src)

else //dest 位於src+count中間,

{d = dest+count;

s = src+count;

while(count--)

*d-- = *s--; //倒過來拷貝

memcpy記憶體重疊的解決

記憶體重疊 拷貝的目的位址在源位址範圍內。所謂記憶體重疊就是拷貝的目的位址和源位址有重疊。在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。memmove函式對記憶體重疊做了處理...

memcpy記憶體重疊問題

之前一直沒有注意到記憶體複製函式的記憶體重疊問題。今天偶遇遂琢磨了一下,記之。void mymemcpy void dst,const void src,size t num assert dst null src null if dst src num src dst num return dst...

memcpy和memmove記憶體重疊問題解析

區別 memcpy和memmove 都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下 cpp view plain copy print?void memcpy void dst,const void src,size t count void me...