Re: [問題] 二維陣列給值的問題

看板C_and_CPP (C/C++)作者 (高金素箍)時間14年前 (2011/08/25 02:02), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串3/4 (看更多)
※ 引述《johnsontupm (MH)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Dev-C++ & VC 2010 : 問題(Question): : 之前在 #1EKY4lgk 問了有關陣列的一些問題,雖然最後問題還是沒解決,但 : 感謝各位前輩給我的一些意見 : 執行結果如圖:http://i.imgur.com/Dqlkq.png
: 而這次我想問的問題還是陣列,程式碼在下面,第一個二維陣列a我是一個字 : 元一個字元給,但直接印出字串跟之前問的一樣,後面還是有亂碼,試過若 : 令char a[28][28];就會不會有這個問題,但這不是根本解決之道... : 第二個陣列則是一次複製一整個字串,雖然在迴圈內輸出是OK的,但出了迴圈 : 在新的迴圈再次印出時就又會錯了,感覺有點像把剛剛的b陣列以遞減的方式 : 印出,但這是為什麼呢?要如何解決? : 第三個陣列也是一個一個給,比b陣列更糟糕,後面多了一拖拉庫有的沒有的 : 資料 : 以上問題已拜過Google,我對二維陣列還不是很熟,一般市面上的書也沒詳細 : 說過(就我在書店看過的),之後還有pointer的一些問題,一想到就頭痛..., : 麻煩各位先進幫忙解惑,感謝 m(_ _)m : 程式碼(Code):(請善用置底文網頁, 記得排版) : http://codepad.org/Wa12HAPF 陣列 != 字串 用陣列真的只是方便操作而已,當你使用%s來印內容時,要隨時記住 printf會逐個字元印直到遇見結束字元('\0')為止 然後我忘記標準有哪個章節提到陣列的每個元素所佔的記憶體空間是 連續的,所以雖然是2維陣列,你也可以將它視為1維來看: [ 0][ 1][ 2] ┌─┬─┬─┐ [ 0]│ │ [ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8] ├─┼─┼─┤ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┐ [ 1]│ │ →│ │ ├─┼─┼─┤ └─┴─┴─┴─┴─┴─┴─┴─┴─┘ [ 2]│ │ └─┴─┴─┘ 然後每個迴圈都跟你講解一下: 第一個迴圈: for(i=0; i<3; i++){ for(j=0; j<3; j++){ a[i][j] = '0'; } printf("%2d %s\n", i, a[i]); } 因為你第一次只有把陣列前3個元素填東西,但是因為a是區域變數, 所以其值編譯器沒有義務幫你把它全部設為某個初始值,所以印出內 容的時候應該是: "000??????......" ^ 從這裡開始印 打問號的地方就是無法確定的輸出,因為其值不一定對應到一個可印 字元,長度也無法確定,因為後面也不知道啥時出現一個結束字元。 第二次執行:"000000???......" ^ 從這裡開始印 第三次執行:"000000000......" ^ 從這裡開始印 再來是第二個迴圈的部份: strcpy 不只會複製你雙引號 " 裡夾的字元,因為這是字串複製,也要 保證後面有一個結束字元存在,所以還會複製第四個字元'\0'在末端: 第一次執行:"111\0?????......" ^ 從這裡開始印 第二次執行:"111111\0??......" ^ 從這裡開始印 第三次執行:"111111111\0......" ^ 從這裡開始印 這裡要注意「你陣列裡只能存9個字元」,所以最後一個'\0'實際上是 存到別的變數所在的記憶體內了!除非你真的確定那個變數在你的合理 控管之下,不然你無權這樣做! 第三個迴圈的部份: 跟第二個迴圈一樣,只是因為你一開始的狀態就是 "111111111\0......" ^ 第一次從這裡印 ^ 第二次從這裡印 ^ 第三次從這裡印 第四個迴圈的部份: 這只是逐個字元設值並印出,沒有什麼特別的。 第五個迴圈的部份: 會有這種情況是記憶體出現這樣子的擺放情形 "222222222111111111\0......" 粉紅色的字元'2'是你在第四迴圈就設定的,共9個,而後面的'1'則是屬於 陣列 b[]的記憶體內容,所以分布如下: ← b[] → "222222222111111111\0......" ← c[] → ^ 結束字元還是不知道存在哪個變數裡 不過這樣子的擺放情形和定義的位置沒有絕對的關係,所以你還是不要太 依賴這種結果會比較好,當你即將把它當「字串」來印出的時候,記得多 要一塊空間來存放結束字元,不然就是你自己把陣列裡的字元逐個印出, 這樣會比較保險就是了。 -- ★ ★ ███ ███ █▌█ ██◣ ███ ▋▋█ █▂█ █▃█ ███ █▆█ █▄█ ███ █ ◣ █ █ ▋██ █▆◤ ███ ███ Kim Jae Kyung Koh Woo Ri Cho Hyun Young Kim Ji Sook φwindyhorse No Eul Oh Seung A Jung Yoon Hye -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

08/25 02:12, , 1F
補充一下, 最後一個for-loop, c[]的內容會在b[]前面, 完
08/25 02:12, 1F

08/25 02:13, , 2F
全是看compiler的高興與安排. 也許改code再編譯就不同了
08/25 02:13, 2F

08/25 02:59, , 3F
圖文並茂!
08/25 02:59, 3F

08/25 04:27, , 4F
感謝圖文教學,晚上不睡覺真是辛苦了
08/25 04:27, 4F
※ 編輯: loveme00835 來自: 140.121.197.115 (08/25 09:12)
文章代碼(AID): #1ELJoqL- (C_and_CPP)
文章代碼(AID): #1ELJoqL- (C_and_CPP)