这是我的一位朋友写过的C程序。
据我所知,在C99引入VLA之前,或者在运行时使用malloc
之前,必须在编译时初始化数组。
但是这里程序接受来自用户的const
的值并相应地初始化数组。
即使使用gcc -std=c89
,它也能正常工作,但对我来说看起来非常错误。
它是否都依赖于编译器?
#include <stdio.h>
int
main()
{
int const n;
scanf("%d", &n);
printf("n is %d\n", n);
int arr[n];
int i;
for(i = 0; i < n; i++)
arr[i] = i;
for(i = 0; i < n; i++)
printf("%d, ", arr[i]);
return 0;
}
答案 0 :(得分:2)
将-pedantic
添加到您的编译选项(例如-Wall -std=c89 -pedantic
),gcc
会告诉您:
warning: ISO C90 forbids variable length array ‘arr’
这意味着您的程序确实不符合c89 / c90。
使用-pedantic
和-pedantic-errors
gcc
进行更改将停止翻译。
答案 1 :(得分:1)
这称为可变长度数组,在C99中允许使用。使用c89
标志在-pedantic
模式下编译,编译器将为您提供警告
[Warning] writing into constant object (argument 2) [-Wformat]
[Warning] ISO C90 forbids variable length array 'arr' [-Wvla]
[Warning] ISO C90 forbids mixed declarations and code [-pedantic]