欢迎来到天天文库
浏览记录
ID:44208550
大小:117.23 KB
页数:7页
时间:2019-10-19
《C语言变长数组之剖析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C语言变长数组之剖析(陈云川ybc2084@163.comUESTC.CD)1、引言我们知道,与C++等现代编程语言不同,传统上的C语言是不支持变长数组功能的,也就是说数组的长度是在编译期就确定下来的,不能在运行期改变。不过,在C99标准中,新增的一项功能就是允许在C语言中使用变长数组。然而,C99定义的这种变长数组的使用是有限制的,不能像在C++等语言中一样自由使用。2、说明参考文献⑴中对变长数组的说明如下:C99givesCprogrammerstheabilitytousevariablelengtharrays,whichaie
2、arrayswhosesizesarenotknownuntilruntime・Avariablelengtharraydeclarationislikeafixedarraydeclarationexceptthatthearraysizeisspecifiedbyanon-constantexpression.Whenthedeclarationisencountered,thesizeexpressionisevaluatedandthearrayiscreatedwiththeindicatedlength,whichmustb
3、eapositiveinteger.Oncecreated,variablelengtharraycannotchangeinlength.Elementsinthearraycanbeaccesseduptotheallocatedlength;accessingelementsbeyondthatlengthresultsinundefinedbehaviorThereisnocheckrequiredforsuchout-of-rangeaccesses・Theanayisdestroyedwhentheblockcontaini
4、ngthedeclarationcompletes・Eachtimetheblockisstarted,anewarrayisallocated・以上就是对变长数组的说明,此外,在文献⑴中作者述说明,变长数组有以下限制:1、变长数组必须在程序块的范围内定义,不能在文件范围内定义变长数组;2、变长数组不能用static或者extern修饰;3、变长数组不能作为结构体或者联合的成员,只能以独立的数组形式存在;4、变长数组的作用域为块的范围,对应地,变长数组的生存吋间为当函数执行流退出变长数组所在块的时候;上述限制是最常见的一些限制因素,此外
5、,当通过typedef定义变长数组类型时,如何确定变长数组的长度,以及当变长数组作为函数参数时如何处理,作者也做了一一说明。详细的细节情况请参阅文献[1]。由于变长数组的长度在程序编译时未知,因此变长数组的内存空间实际上是在栈中分配的。gcc虽然被认为是最遵守C语言标准的编译器之一,但是它并不是严格按照ISOC标准规立的方式来实现的。gcc的实现方式采収了这样的策略:最大限度地遵守标准的规定,同时从实用的角度做自己的扩展。当然,gcc提供了编译选项给使用者以决定是否使用这些扩展功能。gcc的功能扩展分为两种,一种是gnu自己定义的语言扩
6、展;另外一种扩展是在C89模式中引入由C99标准定义的C语言特性。在参考文献⑵中,有关gcc的C语言扩展占据了将近120页的篇幅,扩展的语言功能多达几十个,由此可看出gcc的灵活程度。在参考文献⑵中,对变长数组的描述如下:Variable-lengthautomaticarraysareallowedinISOC99,andasanextensionGCCacceptstheminC89modeandinC++.(However,GCC'simplementationofvariable-lengtharraysdoesnotyetco
7、nformindetailtotheISOC99standard.)TheseaiTaysaredeclaredlikeanyotherautomaticarrays,butwithalengththatisnotaconstantexpression.Thestorageisallocatedatthepointofdeclarationanddeallocatedwhenthebracc-lcvclisexited.以上这段话并没有详细的说明gcc的变长数组实现和ISOC99的差异允竟体现在什么地方,但是从描述來看,基本上和文献⑴中
8、的描述是一-致的。文献⑵中没有说明而在文献⑴中给予了说明的几点是:变长数组是否能用static或者extern修饰;能否作为复合类型的成员;能否在文件域起作用。另外,在文献⑵中提到,采用alloca()函数
此文档下载收益归作者所有