我知道下一个代码不应该运行。
第一个问题是宣布' int i'在循环内部,而不是在开始代码。
下一个问题是数组大小是在运行时定义的,因此我们必须使用动态分配。
我应该得到"段fualt"。
我用命令运行它:
gcc -Wall commandLineArgument.c -o ex1
int main(void){
int size=0;
printf("enter number:\n");
scanf("%d",&size);
printf("The size is: %d\n",size);
int arr[size];
for(int i= 0;i<size;i++)
{
arr[i] = 5;
}
for(int i= 0;i<size;i++)
{
printf("%d,",arr[i]);
}
printf("\n");
return 0;}
修改 如果自C99起C中支持可变长度数组 然后如何运行更新代码?
gcc -Wall -std=c89 commandLineArgument.c -o ex1
int main(void){
int i;
int size=0;
printf("enter number:\n");
scanf("%d",&size);
printf("The size is: %d\n",size);
int arr[size];
printf("The size of arr: %lu\n",sizeof(arr));
for(i= 0;i<size;i++)
{
arr[i] = 5;
}
for(i= 0;i<size;i++)
{
printf("%d,",arr[i]);
}
printf("\n");
return 0;}
答案 0 :(得分:1)
这是不合时宜的:您的代码自C以来一直是有效的C.
由于至少C99,您可以在i
循环中本地声明for
。
自C99以来,C中支持可变长度数组。 (请注意,即使在C ++ 17中也不支持此功能。)
答案 1 :(得分:1)
看起来您使用的是旧版本的gcc。
您尝试使用的两个功能已添加到C99中。
早于版本5的gcc
版本的默认值是使用旧的C89标准进行编译。要使用在以后标准中添加的功能,您需要明确告知旧版gcc
使用更新的标准。
编译器选项-std=c11
指示gcc
使用当前的C11标准。您需要的最小值是-std=99
。
我建议您告诉gcc
使用当前标准:
gcc -Wall -std=c11 commandLineArgument.c -o ex1
解决问题的另一种方法是升级到gcc
v5或更新版本。