Re: [問題] 迴圈裡面宣告的變數

看板C_and_CPP作者 (朴髮箍)時間13年前 (2011/04/17 03:45), 編輯推噓3(306)
留言9則, 6人參與, 最新討論串3/4 (看更多)
※ 引述《firejox (Tangent)》之銘言: : 以下只是個人的拙見 : 有錯請各位大大們幫忙指正 : 我來說明一下我的code 改貼在網路上: http://codepad.org/hxE8df8R : 一般而言 如果宣告array[n] : 代表array 是有n個陣列 : 如果是array[0] 呢 : 0個陣列 就像指標 : 由於宣告的是陣列 所以本身會在可使用的地方 : 還有一點是 因為c並不會判斷是否超過宣告的範圍 : 他允許超出陣列 在陣列之後的他不會去定義 : 一切都得看系統決定 所以也有 segment fault的風險 : 不過要宣告array[0]還要看compiler : 一些老舊的compiler並不會去處理就是了 : 現在還有直接宣告array[]的作法 : 不過似乎是屬於C9x的? 又到了引經據典的時間: C99 says: 6.7.5.2 Array declarators Constraints 1 In addition to optional type qualifiers and the keyword static, the [ and ] may delimit an expression or *. If they delimit an expression (which specifies the size of an array), the express- ion shall have an integer type. If the expression is a constant expression, it shall have a value greater than zero. // 以下略 這表示函式的宣告中, 陣列中括號裡可以夾星星: int max( int elements[*], size_t count ); 程式碼: http://codepad.org/5Obere23 或是如粉紅色字體所寫, 中括號裡的敘述值只能擺正整數: int array[ 0 ]; 以上這行, 用 gcc 編譯加上選項 -pedantic 就會顯示警告: [Warning] ISO C forbids zero-size array 'array' 這樣做會導致未定義行為! 程式會怎麼掛沒人保證; 而不是會怎麼 跑沒人保證... 你的作法可以換個方式來呈現, 程式碼: http://ppt.cc/n2Sa 這其實跟陣列會不會做 boundary check 沒關係, 隨便給一個位址 , 不管它是不是未定義行為, 對指標運算再印出來當然不會 segm- ent fault,因為你從未對算出來的位址做取值的動作! 取值下去又 變成置底文第二誡: 2. 不能存取超過陣列既定範圍的空間 在這裡補上較省空間又能達成原原po需求的程式碼: http://codepad.org/MiX75GVX 順帶一提, 陣列中括號裡不放東西, 僅限用於宣告當中: extern int m[]; 之前強調過很多次巨集常數不要用小寫, 一個誤用的例子是: http://codepad.org/tXVxZe82 這兩種陣列其實是不一樣的東西! a1 是靜態陣列, a2 則是 VLA, 詳情就不再贅述了. - 我當程式語言助教是不反對學生寫題目練邏輯. 但是許多人練到後 來只活在自己的世界, 結構鬆散語意不明的程式比比皆是, 它們被 創造只是為了產生預料中的輸出, 可以用不健康來形容, 每次Demo 時看到這些小寶貝們都感到很難過. 借用一下 LPH大 的簽名檔: let us heal the program... -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/17 04:25)

04/17 07:28, , 1F
所以立志要當牧師了 (誤)
04/17 07:28, 1F

04/17 09:01, , 2F
對於小寶貝來說,那只是過程。
04/17 09:01, 2F

04/17 16:17, , 3F
我有看過很可怕的 code ,大概像這樣
04/17 16:17, 3F

04/17 16:17, , 4F

04/17 18:59, , 5F
原來是這樣 我之前都使用不健康的code XD
04/17 18:59, 5F

04/18 11:04, , 6F
印象中好像有種叫struct hack的寫法也喜歡用 char arr[0]
04/18 11:04, 6F

04/18 11:23, , 7F
http://tinyurl.com/3h8fj9b 如果你說的 struct hack 是
04/18 11:23, 7F

04/18 11:23, , 8F
這種,那麼用 [0] 不是必要的,微軟有用,它用 [1]
04/18 11:23, 8F

04/18 11:41, , 9F
感謝 p 大指正
04/18 11:41, 9F
文章代碼(AID): #1DgV76tB (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DgV76tB (C_and_CPP)