看板 SFFamily 關於我們 聯絡資訊
※ [本文轉錄自 C_and_CPP 看板] 作者: ikari512 ( //StrategyBass) 看板: C_and_CPP 標題: [心得]關於array initialization (陣列初始化)的筆記 時間: Fri Nov 28 00:49:37 2008 最近在版上問了一些關於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 (聚合資料)...] 粗略說就是... 如果aggregare型別(如array/struct)初始不完全,而且又是用大括弧方式初始, 就會像static變數一樣,自動把沒初始到的部份補0 所以,我們又可以知道 以下這種初始方式: int num[10] = {0}; 可以說對,也可以說錯 因為照標準,這是部份初始化,又是array,所以其他也都會是0,看起來好像有初始效果 但這只是部份初始化的順帶效果,算你好運 如果compiler沒照標準,這樣就只有對第一個元素給值,其他就看天意,所以也算錯 而且這樣會造成誤解,以為會全部都設成0 int num[10] = {255}; //之前版友的例子 這樣其實只有第一個是255,其他都會是自動補的0,不是全部都是255 所以最好乖乖來,用memset,或是loop去初始 以上,有錯請鞭 ._./~ -- // IKARi 擁有追隨自己內心與直覺的勇氣,你的內心與直覺多少已經知道你真正想要成為什麼樣的 人,任何其他事物都是次要的。 Steve Jobs -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.168.181.96
williamyu:感謝整理:) 11/28 11:08
chrisdar:int num[10] ={}; 這樣寫呢 11/28 11:20
chrisdar:char num[10] = ""; 這樣寫呢 11/28 11:28
-- 妳憑什麼愛我...? 又憑什麼要走...! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.117.169