Re: [問題] 靜態陣列可調整大小?

作者: LPH66 (-6.2598534e+18f)   2014-11-26 08:55:53
※ 引述《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 可以用了也不需要這招
作者: bleed1979 (十三)   2014-11-26 10:50:00
java似乎有[0]

Links booklink

Contact Us: admin [ a t ] ucptt.com