C语言中变量可以定义数组吗?

        先说结论,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)C99C11。C89是最早且广泛使用的版本,至今仍是许多大学教学的基础。C99和C11作为后续版本,对C89进行了扩展和改进,增加了一些新特性,同时保持了对C89的兼容性。

          C89和C99在数组定义上有着显著的差异。C89规定数组的长度必须是一个常量表达式,不允许使用变量来指定数组的大小,无论这些变量是否已经初始化。相对地,C99放宽了这一限制,允许使用变量来定义数组的长度,这为编程提供了更大的灵活性。

        大多数编译器对C89标准有着良好的支持。对于C99,开源编译器如GCC和基于LLVM的Clang已经实现了对大部分C99特性的支持。然而,微软的Visual C++(VC)和Visual Studio(VS)在早期版本中对C99的支持相对有限,直到VS2013及之后的版本才开始逐渐提供支持,但支持程度仍有待提高。

      

PS:解答我疑惑的答案

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值