作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 指標複製問題
時間Mon Aug 22 00:12:36 2011
我不知道你手邊的書是哪本、寫得好不好,
可以確定的是: 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
推 james732:推用心講解 08/22 00:14
推 handsome616:有神快拜 08/22 00:15
推 tonyhsie:推用心圖解 08/22 01:47
推 KTFGU:推(筆記ing 08/22 01:55
推 xatier:駐版大神快拜!! 08/22 18:01
推 VictorTom:推耐心講解XD 08/22 22:25
→ kswiss11:請問解答者,第二行那理的Hello EveryBody!!的記憶體在也 08/23 22:48
→ kswiss11:碰不到,示指哪一行呀??? 08/23 22:49
→ tropical72:.. 我回信給你了好嗎.. 08/23 22:55
→ loveme00835:解答者... 08/24 08:38
※ 編輯: tropical72 來自: 180.177.78.41 (08/24 12:22)