→ bleed1979: java似乎有[0] 11/26 10:50
※ 引述《lionheart60 (宅熊冗厚)》之銘言:
: 如果這是蠢問題就請噓爆我@@
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: GCC
: 問題(Question):
: 有一個巢狀結構如下述,請問那個records的陣列大小是可以調整的嗎@@?
: 程式碼(Code):(請善用置底文網頁, 記得排版)
: typedef struct{
: time_t t;
: double d;
: }Value;
: typedef struct{
: int NumberOfRecords;
: struct _Record{
: char Name[64];
: Value value;
: }records[1];
: }Message;
這個算是一個古早技巧的適應寫法
原始想法可參看 #1AY_NFx1 這篇文章
問題在於 C90 標準裡不允許長度零的陣列,宣告必須至少要是 [1]
所以只好寫 [1] 在這裡, 然後 malloc 時多一點計算
C99 出了 VLA, 所以這種狀況就能改寫成
struct _Record {
/* ... */
} records[];
注意這裡 [] 中沒有 0 也沒有 1 了, 這就是 VLA
不過使用上就會有一些限制
例如有 VLA 的 struct 不能當做別的結構的成員、
VLA 必須要是 struct 的最後一個元素等等
不過 gcc 倒是加了幾個還滿合理的支援當做 gnu extension 就是了
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
C++ 的話則因為這種結構不能直接 new 所以也沒什麼在用
(而且沒記錯的話 C++ 也是不給寫 [0] 的樣子)
再說要 VLA 的話 C++ 已經有 vector 可以用了也不需要這招
--
1985/01/12 三嶋鳴海 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町
つぐみ 歡迎來到 1994/05/21 高江ミュウ 1997/03/24 守野いづみ 1997/03/24 伊野瀬
チサト 1998/06/18 守野くるみ 打越鋼太郎的 1999/10/19 楠田ゆに 2000/02/15 樋口遙
2002/12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 ∞與∫的世界 2011/04/02 茜崎空
啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞 2019/04/01~07 某大學合宿
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416963357.A.DBE.html
※ 編輯: LPH66 (123.195.39.85), 11/26/2014 08:56:56