retweet

C语言的"变量长度数组"

最近细读《Programming in C》,里面讲数组时讲到了“变量长度数组”,说有的编译器支持这样的用法: int i=10; char buf[ i ]; 我测试发现VC6是不支持这个的,但是GCC支持!我写了这样的测试代码,发现程序居然也支持i是负数,而且在负数的情况下,GCC的内存分配虽然怪异,但也是保证正确的。
CODE:
#include #include void fun(int i) { char kk = 'B'; char buf[ i ]; char mm = 'E'; printf("size :: %d %x -- %x\n", sizeof(buf), (size_t)buf, (size_t)&buf[i-1]); buf[i-1] = 'a'; printf("\t\t\t buf[i-1]:%c\t %x:%c \t %x:%c \n", buf[i-1], (size_t)&kk, kk, (size_t)&mm, mm); } int main(int argc, char * argv[], char * envp[]) { fun(2); fun(3); fun(4); fun(1); fun(0); fun(-1); fun(-10); }
GCC安全的为负数长度的数组分配了空间,保证了这种数组的安全使用, 不会影响栈上的其他变量空间。 下面是输出:
CODE:
size :: 2 bfbfec50 -- bfbfec51 buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: 3 bfbfec50 -- bfbfec52 buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: 4 bfbfec50 -- bfbfec53 buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: 1 bfbfec60 -- bfbfec60 buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: 0 bfbfec60 -- bfbfec5f buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: -1 bfbfec60 -- bfbfec5e buf[i-1]:a bfbfec7f:B bfbfec7e:E size :: -10 bfbfec60 -- bfbfec55 buf[i-1]: bfbfec7f:B bfbfec7e:E
*我的疑问:*
  1. 0长度的数组有什么意义? [I] 这个经过搜索资料,我已经知道了,参考:http://bbs.chinaunix.net/viewthread.php?tid=854949 [/I]
  2. 在产品级的软件开发中,这种“变量长度数组”有人应用吗?
嗯,我估计这种不通用的东西产品里应该很少用。尽量避免使用,增强移植性。 至于数组长度是负数的情况,我是这么想的: GCC就像数学家发现自然数后又发现了负数那样,GCC为人们实现了负数数组长度,并告诉我们数组长度也可以是负数。 至于负数有什么物理意义,数学家先不管了;数组长度负数有什么实际意义,Gcc就不管了。

--EOF--

若无特别说明,本站文章均为原创,转载请保留链接,谢谢

本文地址: http://www.dulao5.com/note/2006/11/28/var-length-array-in-c-lang.textile