我正在解决一个问题。在我的代码中,我有两个数组 阵列[]; 数组2 [];
我通过scanf输入2个数字,我希望数组的大小为1和2的数量,例如
int x;
int y;
scanf(" %d %d\n",&x,&y);
int indexX[x*y];
int indexY[x*y];
这不起作用。 作为C的新手,我完全失去了如何实现它,是动态分配内存的唯一方法吗?如果不是,我怎样才能达到想要的结果?或者我怎么能动态地为它记忆? 我的代码抛出错误
warning: ISO C++ forbids variable length array ‘indexX’ [-Wvla]
warning: ISO C++ forbids variable length array ‘indexY’ [-Wvla]
答案 0 :(得分:1)
根据您的错误消息,您使用C ++编译器进行编译。不要! C不是C ++,C ++不是C类。他们是不同的语言。正如消息所述,C ++不提供VLA(见下文)。
使用符合标准的C编译器,或至少使用C99编译器。 可变长度数组(VLA)添加了标准的C99版本作为强制功能。 C11通过使其成为可选项来放宽它,但是大多数(如果不是全部)支持C99的编译器也在C11模式下实现它。
在定义数组之前,您应该通过检查scanf
的结果来验证scanf
是否真的设置了这两个变量。否则你使用未初始化的变量,这是未定义的行为,并且可能(可能 - 将)导致奇怪的行为 - 充其量。
另外,您还可以在scanf
到1
之前初始化变量(大小为0的VLA也是未定义的行为)。通过这种方式,您可以稍后进行检查,并且使用VLA定义仍然是安全的。
警告:大多数(如果不是全部)现代实现都将VLA置于堆栈中。堆栈的大小通常限制在大约100个字节(嵌入式系统),直到某些MiB(Windows,OS-X,Linux等标准操作系统)。没有检查VLA是否适合堆栈,因此不应分配太大的数组。如果您不确定,最好使用动态分配的内存(malloc
和朋友)。