设为首页 加入收藏

TOP

GCC 中零长数组与变长数组
2015-02-02 14:37:01 来源: 作者: 【 】 浏览:8
Tags:GCC

前两天看程序,发现在某个函数中有下面这段程序:


在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量。例如下面这样


但从上面看第三种定义数组的方法也是正确的,于是,我用 gcc 去编译这段程序,发现确实没报错,而且我对此数组进行一些操作,结果也都是正确!这简直颠覆了我的知识框架!难道大学老师教我的、我平时看的书,都是错误的吗?!我开始寻找答案...


最官方的解释应该是 C 语言的规范和编译器的规范说明了。


这下,终于安心了,原来这种语法确实是 C 语言规范,GCC 非常完美的支持了 ISO C99。但令人遗憾的是,我们的大学老师教给我们的还是老一套,虽然关系不是很大,但这也从侧面反映了我们的教育是多么地滞后!而且我们读的 C 语言书,在不加任何限定的条件下,就说某某语法是不对的,读书的人只能很痛苦地记下!小小吐槽一下,下面继续...


这种变长数组有什么好处呢?你可以使用?alloca?函数达到类似的动态分配数组的效果,但 alloca 函数分配的空间在函数退出时还依然存在,你需要手动地去释放所分配的空间;VLA 就不一样了,在数组名生命周期结束之后,所分配的空间也就随之释放。


当然,关于 VLA 还有很多限制,例如 ISO/IEC9899 给出了下面这个例子:


至于上面语法的原因,请参考?ISO/IEC9899?。


GCC 中允许使用零长数组,把它作为结构体的最后一个元素非常有用,下面例子出自 gcc?官方文档


从上例就可以看出,零长数组在有固定头部的可变对象上非常适用,我们可以根据对象的大小动态地去分配结构体的大小。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux 内核进程管理之进程ID 下一篇Linux Kernel代码艺术——数组初..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: