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