[心得]關於array initialization (陣列初始化) …

看板C_and_CPP (C/C++)作者 ( //StrategyBass)時間16年前 (2008/11/28 00:49), 編輯推噓3(306)
留言9則, 5人參與, 最新討論串1/1
UPDATE 2010-06-18 : 以下文章有兩個地方有問題,請直接參考 Array initialization (陣列初始化) in C http://ikariwing.blogspot.com/2008/11/array-initialization.html 因為blog更新比較簡便(上色、排版...),所以一直持續有修改和補充 這邊就沒改了,請多多包含... ======================================================================== 最近在版上問了一些關於array initialization的問題,還和高手同學討論了一下 稍微整理筆記如下,來討論看看有沒有錯... 以下都用gcc 4.1.2測試 (1.)array宣告了但沒初始 int num[10]; //沒初始 去讀的話,都是垃圾值 (2a.)array宣告了,但只有部份初始(版本1) int num[10]; num[0] = 999; 除了num[0]以外,也都是垃圾 (2b.)array宣告了,但只有部份初始(版本2,用大括弧) int num[10] = {1,2,3}; //沒初始完全 因為用大括弧,沒初始的部份會自動補成0 這是因為... (節錄自tinlans大,英文是C99的一段) [...If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration. array 和 struct 這類東西在程式語言裡都被歸類為 aggregate (聚合資料)...] 粗略說就是... 如果aggregate型別(如array/struct)初始不完全,而且又是用大括弧方式初始, 就會像static變數一樣,自動把沒初始到的部份補0 所以,我們又可以知道 以下這種初始方式: int num[10] = {0}; 可以說對,也可以說錯 //問題1,應該是對的 programmer依照spec來做並沒有錯 因為照標準,這是部份初始化,又是array,所以其他也都會是0,看起來好像有初始效果 但這只是部份初始化的順帶效果,算你好運 如果compiler沒照標準,這樣就只有對第一個元素給值,其他就看天意,所以也算錯 而且這樣會造成誤解,以為會全部都設成0 //問題2,應該說 會誤解成全部設成同一個值 int num[10] = {255}; //之前版友的例子 這樣其實只有第一個是255,其他都會是自動補的0,不是全部都是255 所以最好乖乖來,用memset,或是loop去初始 以上,有錯請鞭 ._./~ -- // IKARi 擁有追隨自己內心與直覺的勇氣,你的內心與直覺多少已經知道你真正想要成為什麼樣的 人,任何其他事物都是次要的。 Steve Jobs -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.168.181.96

11/28 11:08, , 1F
感謝整理:)
11/28 11:08, 1F

11/28 11:20, , 2F
int num[10] ={}; 這樣寫呢
11/28 11:20, 2F

11/28 11:28, , 3F
char num[10] = ""; 這樣寫呢
11/28 11:28, 3F
weii:轉錄至看板 SFFamily 11/28 11:50

11/28 14:19, , 4F
char num[10]="": 宣告num為char[10]並令num[0]='\0'
11/28 14:19, 4F

11/28 17:17, , 5F
二樓:測試結果都是0
11/28 17:17, 5F

11/28 17:17, , 6F
三樓:測試結果都是0
11/28 17:17, 6F
※ 編輯: ikari512 來自: 140.113.215.185 (11/28 17:36) XXX ikari512:MOONRAKER:測試結果是垃圾 11/28 17:36 修正:我腦包了,以為M大要我測試,其實是在解釋原因,Thx!

11/28 19:03, , 7F
memset如果不適用在char,且初始值又不是0的話很麻煩
11/28 19:03, 7F

11/29 00:43, , 8F
樓上,的確是…不知道怎麼作會比較適當呢?
11/29 00:43, 8F

11/29 21:25, , 9F
我不是寫partial code給你測試吧,喂
11/29 21:25, 9F
※ 編輯: ikari512 來自: 218.168.183.242 (12/01 04:14) ※ 編輯: ikari512 來自: 114.25.178.7 (06/18 12:47) ※ 編輯: ikari512 來自: 114.25.178.7 (06/18 15:39) ※ 編輯: ikari512 來自: 114.25.178.7 (06/18 15:39)
文章代碼(AID): #19Bi-glU (C_and_CPP)
文章代碼(AID): #19Bi-glU (C_and_CPP)