VS里面 C语言数组初始化报错怎么解决

代码如下:
int m=25;
int s[m] ;
同样的代码在Dev c++可以运行,可是到了vs就报错,报错内容是赢输入常量表达式。
请问这个怎么解决?

问题1:数组初始化报错?
解决方案有如下几种:
(1)添加const修饰,定义常变量

const int m = 25;
int s[m];

(2)将变量m改成宏定义

#define m 25
int s[m];

(3)将s改成动态数组

int m = 25;
int *s = new int[m];
  • 目前经常使用的C语言有三个版本,分别是 C89(C90)、C99 和 C11。C89(也称 ANSI C)是较早的版本,也是最经典的版本,国内大学几乎都是以该版本为基础进行授课。C99 和 C11 是后来对 C89 的升级,增添了一些新内容(不多),语法更加灵活了,同时兼容 C89。
  • 开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准(GCC与Dev-Cpp都是支持C99的,Dev-Cpp底层是用MinGW为编译平台,MinGW则是Linux,Unix下的编译器gcc的Win32移植版。),而微软的 VC、VS 对 C99 却不感兴趣,直到后来的 VS2013、VS2015、VS2017 才慢慢支持,而且支持得还不好。
  • 因为 C89和 C99 对数组做出了不同的规定:

    在 C89中,必须使用常量表达式指明数组长度;也就是说,数组长度中不能包含变量,不管该变量有没有初始化。
    而在 C99 中,可以使用变量指明数组长度。

img

问题2:函数传值产生“非常量引用的初始值必须是左值”?
解释:出现这种情况是因为调用函数的形参类型是 T&(T为某一类型),该类型与调用参数值传入不一致,比如函数中形参是int型,而传入实参是double,存在隐式类型转化,系统会自动产生临时变量temp将常量进行了修改。
方法:有两种方法可以解决以上问题,一是避免隐式转换;二是避免修改形参。

亲,如果问题回答满意,请点下采纳,谢谢!

因为dev默认支持c99,而vs默认不支持,这种定义方式属于变长数组(VLA),只有c99之后才支持变长数组

将m = 25宏定义好了

c语言本来就不支持这种声明方式。[]里必需是常量不能是变量。