遇到這樣乙個問題,當陣列進行拷貝的時候,如果是在同乙個陣列內拷貝,就有可能出現記憶體重疊的問題,比如
#includevoid copy(int *a, int *b,int len)//b從開始複製len個數字到a
}int main()
; copy(&arr[0], &arr[3], 7); //4,5,6,7,8,9,10,8,9,10
for (i = 0; i < 10; i++)
return 0;
}
結果也正確
但是當我們這樣寫
#includevoid copy(int *a, int *b,int len)//b從開始複製len個數字到a
}int main()
; copy(&arr[3], &arr[0], 7); //1,2,3,1,2,3,4,5,6,7
for (i = 0; i < 10; i++)
return 0;
}
原意是想輸出1,2,3,1,2,3,4,5,6,7,但是當我們執行的時候卻發現是這樣
這就是記憶體重疊的問題了,因為在我們複製的時候,我們自身的值被覆蓋所以就導致重複出現123的問題了。
在這樣的情況下,我們應該反向複製元素,就是從最後乙個元素往前複製
void copy(int *a, int *b,int len)//b從開始複製len個數字到a
所以我們複製的時候需要分兩種情況,一種是原陣列在目標陣列後,一種是原陣列在目標陣列前面,而且我們還要考慮是否有記憶體重疊的部分,所以我們應該這麼做
void copy(int *a, int *b,int len)//b從開始複製len個數字到a
}else //正常複製 }
}
以上就是我對記憶體重疊的理解。 C 學習之記憶體重疊
首先先說一下strcpy,流行的strcpy函式寫法是 char my strcpy char dst,const char src view plain copy 如果注意到 1,檢查指標有效性 2,返回目的指標des 3,源字串的末尾 0 需要拷貝。寫出上面實現函式就不在話下。然而這樣的實現沒有...
c語言學習筆記之記憶體分割槽
c語言有五大記憶體分割槽,分別是棧,堆,全域性區,常量區,區。棧 在需要的時候由編譯器 系統 自動分配,在不需要的時候會由系統自動 的儲存區,記憶體由系統管理,函式中定義的變數儲存在棧中,當呼叫函式的時候函式中定義的變數會被加到棧中,當函式離開的時候,被新增的變數會從棧中移除,棧在最高的位址上,所以...
C語言 記憶體重疊
記憶體重疊 拷貝的目的位址在源位址範圍內。所謂記憶體重疊就是拷貝的目的位址和源位址有重疊。在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。memmove函式對記憶體重疊做了處理...