記憶體移動 很容易混亂的題

2021-06-22 09:09:46 字數 1212 閱讀 4946

記憶體移動的問題重點在於考慮記憶體重疊的區域處理。這是對記憶體位址空間和處理問題能力的綜合考驗。

我今天就遇到了這樣一道面試題:重寫strcpy(),題目是這樣定義函式的:

char *strcpy(char *strdest, const char *strsrc);

要是以前對於我來說,直接就會這樣寫了:

char *strcpy(char *strdest, const char *strsrc)

但是現在我們要很認真地分析這個問題:

我們可以分成兩部分來做,每一部分都考慮它的最極端的情況,根據這兩種極端情況,我們可以對他們作出相應的處理。

(1)這種情況是strdest > strsrc, 但是strdest < strsrc+len-1.其中len=strlen(strsrc).用圖形更好看:(位址從下往上:低到高)

假設strsrc 指向的內容是 "hello";..

..\0o

llstrdest                                   e

strsrc                                    h               

這種情況對於剛開始的那段程式顯然結果是錯誤的。最後返回的是「hhhhh」。

這種強況強烈建議使用從末尾向開頭的順序複製,**如下:

if(strdest > strsrc && strdest < (strsrc + len + 1))

其它情況我們可以很放心地進行從前向後的複製了,而且如果是以下這種情況我們必須從前向後複製:

.     ..

\0o  ll

strsrc                                           e

strdest                                          h  

即strdest= (strsrc + len +1).而這兩種情況我們都可以使用從開頭向末尾進行複製。**如下:

else

*strdest = '\0';

return ret;

}這樣所用的情況都有了。在複製過程中就完全正確了!

下面是對以上問題的總結,方便記住什麼情況我們該怎麼做:

只要strdest(目標位址)在strsrc(源位址)的範圍內,我們就使用從後向前複製即可。其它情況從前向後複製即可! 0

給主人留下些什麼吧!~~

記憶體移動 很容易混亂的題

記憶體移動的問題重點在於考慮記憶體重疊的區域處理。這是對記憶體位址空間和處理問題能力的綜合考驗。我今天就遇到了這樣一道面試題 重寫strcpy 題目是這樣定義函式的 char strcpy char strdest,const char strsrc 要是以前對於我來說,直接就會這樣寫了 char ...

很混亂的DEDEEIMS的欄目遞迴

header content type text html charset utf 8 require data common.inc.php conn new mysqli cfg dbhost,cfg dbuser,cfg dbpwd,cfg dbname if mysqli connect e...

這題很基礎 A的很辛苦

今天5月27日 在杭電oj上a了第一題 留念一下 都說是水題 我才做的 總算圖論入門 題目描述 一開始是用bfs 自我感覺太好,以為和aoj上的hero in maze 一樣,結果連交3次都是wa而告終。於是 再看題意,才發現。當且僅當t t 時,可憐的小狗才能逃出 這樣一來,廣搜就行不通了,因為廣...