Re: [問題] 指標複製問題

看板C_and_CPP (C/C++)作者 (藍影)時間14年前 (2011/08/22 00:12), 編輯推噓6(604)
留言10則, 9人參與, 最新討論串2/2 (看更多)
我不知道你手邊的書是哪本、寫得好不好, 可以確定的是: The c programming language 應是公認首推。 針對你的發問模式,有些問題可能再翻前面說明、再想一下,應可得到答案, 第一次學也沒必要 「亂試」,只要把觀念愈搞愈亂而已。 列出重點程式碼說明 --- char *src="Hello EveryBody!!"; char *p=NULL; char *q=NULL; int total = strle(src); p=(char*)malloc(strlen(src)+1); p[strlen(src)]=0; 到上面為止, 因 src 長度是 17,所以 p 配置了 18 個空間出來, 這 18 個空間都是個問號,且 p 指向的是,這 18 個空間的「開頭」, (當然 src 也是指向 Hello EveryBody!! 的開頭), 同時把 最後一個位置 填上 0 src H e l l o _ E v e r y B o d y ! ! 0 p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 --- q=p; while(*q++ = *src++ ); 我希望你看得懂這是在幹嘛,正確的說,我希望你有一字一字慢慢看過書本說明, 而不是只看程式碼而已。 這是一個「逐一複製」的情況,也就是說 (以下 src 簡寫 s) s H e l l o _ E v e r y B o d y ! ! 0 p q H ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 --- s H e l l o _ E v e r y B o d y ! ! 0 p q H e ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 --- .... s H e l l o _ E v e r y B o d y ! ! 0 p q H e l l o _ E v e r y B o d y ! ! 0 --- 在用 malloc 新增空間出來後,剩下的全都是指標運算, 會先把 p assigned to q, 是因為在複制 src 過程中,最後 q 會跑到結束字元去, 如果不做這個動作,直接用 p 和 src 去跑,結果長這樣 s H e l l o _ E v e r y B o d y ! ! 0 ? p H e l l o _ E v e r y B o d y ! ! 0 <注意這裡,造成memory leak> 最後 p 指標會跑到最後的位置 , 到時候輸出就不會有東西, 甚至一開始用 malloc 出來的空間, 雖最後變成 Hello EveryBody!! 那裡的記憶體再也碰不到了, ( 上面的圖,開頭指標不見了),進而造成 memory leak 現象。 再回到原文,以上述程式碼,如果輸出 p 的話,從 'H' 開始,輸出到 '\0'; 輸出 q 的話,從 '\0' 開始,一樣輸出到 '\0',所以看起來,q完全沒東西。 --- 一行一行、一題一題問,真的不是很好的習慣, 翻課本說明的東西,實在沒必要讓別人再照著課本打一遍給你看, 思考一下吧.. -- When I saw the turth of love, I feel the pain which the world brings to me. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41

08/22 00:14, , 1F
推用心講解
08/22 00:14, 1F

08/22 00:15, , 2F
有神快拜
08/22 00:15, 2F

08/22 01:47, , 3F
推用心圖解
08/22 01:47, 3F

08/22 01:55, , 4F
推(筆記ing
08/22 01:55, 4F

08/22 18:01, , 5F
駐版大神快拜!!
08/22 18:01, 5F

08/22 22:25, , 6F
推耐心講解XD
08/22 22:25, 6F

08/23 22:48, , 7F
請問解答者,第二行那理的Hello EveryBody!!的記憶體在也
08/23 22:48, 7F

08/23 22:49, , 8F
碰不到,示指哪一行呀???
08/23 22:49, 8F

08/23 22:55, , 9F
.. 我回信給你了好嗎..
08/23 22:55, 9F

08/24 08:38, , 10F
解答者...
08/24 08:38, 10F
※ 編輯: tropical72 來自: 180.177.78.41 (08/24 12:22)
文章代碼(AID): #1EKIvzlA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EKIvzlA (C_and_CPP)