先说结论,c语言中利用变量定义数组是可行的,不过,是分情况的,主要看你编译所使用的平台类型。
问题描述
int main()
{
int a[2][3]={1,2,3,
4,5,6};
int w=sizeof(a)/sizeof(a[0]);
int h=(sizeof(a[0]))/(sizeof(a[0][0]));
int b[h][w];
printf("w=%d,h=%d\n",w,h);
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
b[i][j]=a[j][i];
printf("b[%d][%d]=%d\n",i,j,b[i][j]);
}
}
return 0;
}
先说说我是咋发现这个错误的,在GCC编译器上运行以上代码时,printf
函数报错。我最初怀疑问题出在我定义的二维数组上,因为我记得课本上提到定义数组时必须使用常量表达式来指定数组的长度。我首先将二维数组的定义语句改为 int b[3][2]
,即使用常量表达式定义数组。但即便如此,printf
依然报错。随后,我将代码复制到 Visual Studio (VS) 中进行编译,不出意料的报错了,如下图 ,改为常量后,printf继续报错,仔细一看,printf打错了,被自己整无语了,修改后程序就没问题了,随后,我返回 GCC 平台,修正了 printf 函数的调用。这时,我发现即便使用变量定义数组,编译器也没有报错或警告。我就疑惑:变量到底能不能定义数组?
原因分析:
在网上找到了一份可以解答我疑惑的答案:
C语言经历了三个主要的标准化阶段,分别是C89(ANSI C)、C99和C11。C89是最早且广泛使用的版本,至今仍是许多大学教学的基础。C99和C11作为后续版本,对C89进行了扩展和改进,增加了一些新特性,同时保持了对C89的兼容性。
C89和C99在数组定义上有着显著的差异。C89规定数组的长度必须是一个常量表达式,不允许使用变量来指定数组的大小,无论这些变量是否已经初始化。相对地,C99放宽了这一限制,允许使用变量来定义数组的长度,这为编程提供了更大的灵活性。
大多数编译器对C89标准有着良好的支持。对于C99,开源编译器如GCC和基于LLVM的Clang已经实现了对大部分C99特性的支持。然而,微软的Visual C++(VC)和Visual Studio(VS)在早期版本中对C99的支持相对有限,直到VS2013及之后的版本才开始逐渐提供支持,但支持程度仍有待提高。