Re: [問題]雙重 指標存取字串

看板C_and_CPP作者 (CC)時間8年前 (2016/04/05 09:24), 8年前編輯推噓2(205)
留言7則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《mp8113f (丹楓)》之銘言: : http://ideone.com/UhNQlR 先附上原始程式碼 : 這是某本書上的範例但是照打上去於DEv編譯會出現錯誤 : 問題1 : 對於ptr = temp 的這行意義不是很了解 : 看字面上似乎想要讓ptr指標指向temp指標存取的值(指向某字串的位址) : 但temp並未初始,所以這個步驟對我來說有點詭異 : 問題2 : 我假設問題1的步驟可能是要這樣寫 : ptr = &temp : 那麼我想要讓三個字串的起始位址連續存入三個記憶體位址中 : 於是我也寫了跟範例一樣的語法 : *(ptr+0) = string1; : *(ptr+1) = string2; : *(ptr+2) = string3; : 而我想要確認這三個位址是否真的連續接著 : 於是自行加上輸出 : for(n=0 ; n<3 ; n++) : printf("第%d個字串的位址為%p\n",n+1,*(ptr+n)); : 不過1跟2的位址是連續,但第三個位址直接跳去不知道哪個地方 : 很明顯不連續 : 以至於我在加上輸出列印時就產生錯誤 : for(n=0 ; n<3 ; n++) : printf("第%d個字串的字串為%s\n",n+1,*(ptr+n)); : 想要知道問題的點在哪邊 Orz ..毫無頭緒 : 問題3 : 關於置底常見錯誤的12 : 別想對二維陣列使用pointer to pointer : 想請問各位前輩時否有現成的案例可供小弟參考 : 最近也是有類似的想法正在練習不過好像沒出現問題 : 怕我正在走上這條看似正確的誤途上 : 初次在板上請教,煩請各位不吝指教 我有點不知道該怎樣回答你的問題 因為這段程式碼真的.... 把書燒掉好了,別亂丟以免被撿走禍亂別人 首先, ptr 是 char**, 而它指向的 temp 是 char* 也就是它是單一指標, 不是陣列 這種情況下你讀取 *(ptr + 1) 只會拿到垃圾 如果寫入 *(ptr + 1) = xxx... 那就是系統爆炸的開始 因為 ptr 是 char**, temp 是 char* 所以必須寫 ptr = &temp 這麼做的目的通常是因為你想讓 temp 指到別的地方去 例如: temp = string1; printf("temp is %s\n", temp); char **ptr2 = &temp; // 修改 *ptr2 會影響到 temp *ptr2 = string2; printf("temp now is %s\n", temp); 輸出應該是: temp is BOOK temp now is FOR 那麼既然 ptr + n 只會拿到垃圾, 為什麼你的版本可以印出字串來? 因為你把 temp 宣告在 string[1-3] 的前面 所以 ptr + n 很 "狗屎運" 的剛好指到你的 string 如果你把 temp 宣告改放在 string3 後面, 結果就不同了 或是你改動一下 string 123 的宣告順序, 結果也會不一樣 我不知道這個範例到底要講什麼主題 但後面那個 for 看起來佔了很大的部份 所以給你一個 ptr + n 能夠正確運作的版本 http://ideone.com/GbvhOv -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.68.230.200 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1459819483.A.4D0.html ※ 編輯: weiclin (210.68.230.200), 04/05/2016 09:44:36

04/06 12:09, , 1F
會不會原po漏打什麼啊,書會寫出這種東西蠻令人難以置信
04/06 12:09, 1F

04/06 14:54, , 2F
沒有漏寫,所以我提出了問題一覺得很怪..後來發現版上有
04/06 14:54, 2F

04/06 14:55, , 3F
其他篇一樣發問的程式碼,temp都有加上&,才驚覺是書錯誤
04/06 14:55, 3F

04/06 14:56, , 4F
而該書上的位址示意圖也讓三個string字串位址連續,讓我
04/06 14:56, 4F

04/06 14:56, , 5F
以為這樣連著宣告的記憶體一定會連續...
04/06 14:56, 5F

04/06 14:57, , 6F
不過有了各位大大的提點,點醒很多盲點,不能太相信書
04/06 14:57, 6F

04/06 14:57, , 7F
這本書是我拿大學時期的上課用書,可能現在已改版正確了
04/06 14:57, 7F
文章代碼(AID): #1N0nFRJG (C_and_CPP)
文章代碼(AID): #1N0nFRJG (C_and_CPP)