Re: [問題] 迴圈裡面宣告的變數
※ 引述《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
04/17 16:17, 3F
→
04/17 16:17, , 4F
04/17 16:17, 4F
→
04/17 18:59, , 5F
04/17 18:59, 5F
→
04/18 11:04, , 6F
04/18 11:04, 6F
推
04/18 11:23, , 7F
04/18 11:23, 7F
→
04/18 11:23, , 8F
04/18 11:23, 8F
→
04/18 11:41, , 9F
04/18 11:41, 9F
討論串 (同標題文章)