Re: [問題] 指標複製問題
我不知道你手邊的書是哪本、寫得好不好,
可以確定的是: 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
08/22 01:55, 4F
推
08/22 18:01, , 5F
08/22 18:01, 5F
推
08/22 22:25, , 6F
08/22 22:25, 6F
→
08/23 22:48, , 7F
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)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章