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

作者: weiclin (CC)   2016-04-05 09:24:39
※ 引述《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
作者: boss0405 (boss)   2016-04-06 12:09:00
會不會原po漏打什麼啊,書會寫出這種東西蠻令人難以置信
作者: mp8113f (丹楓)   2016-04-06 14:54:00
沒有漏寫,所以我提出了問題一覺得很怪..後來發現版上有其他篇一樣發問的程式碼,temp都有加上&,才驚覺是書錯誤而該書上的位址示意圖也讓三個string字串位址連續,讓我以為這樣連著宣告的記憶體一定會連續...不過有了各位大大的提點,點醒很多盲點,不能太相信書這本書是我拿大學時期的上課用書,可能現在已改版正確了

Links booklink

Contact Us: admin [ a t ] ucptt.com