我编写了以下代码(请参阅该问题的代码注释),
#include<stdio.h>
int main()
{
int size;
scanf("%d",&size);
int arr[size]; /*is it a valid statement?*/
for(int i=1;i<=size;i++)
{
scanf("%d",&arr[i]);
printf("%d",arr[i]);
}
return 0;
}
答案 0 :(得分:6)
使用非常量数组大小是有效的C99但不是C90。有一个较旧的gcc扩展允许它。
请注意,利用此功能可以更加轻松地检查内存分配是否成功。将它与用户提供的值一起使用可能并不明智。
答案 1 :(得分:4)
你不能像这样在C90中分配动态数组。您将不得不使用malloc动态分配它:
int* array = (int*) malloc(sizeof(int) * size);
您也可以从0开始索引数组而不是1,因此for循环应该像这样开始:
for(int i = 0; i < size; i++)
如果你使用malloc方法,你还需要在完成后释放内存:
free(array);
答案 2 :(得分:3)
此外,
C
中的数组索引从0开始,而不是从1开始,并且不包括size
。
int i;
for(i=0 ; i < size ; i++) // Notice the < and the 0
{
//...
}
答案 3 :(得分:0)
编译器尝试在编译时评估int arr[size]
。在这种情况下,arr在堆栈上分配,因此编译器希望提前知道其大小。相反,您需要使用malloc
在堆上分配arr,就像这样。
#include<stdio.h>
int main()
{
int size;
scanf("%d",&size);
int *arr = malloc(sizeof(int) * size);
for(int i=1;i<=size;i++)
{
scanf("%d",&arr[i]);
printf("%d",arr[i]);
}
free(arr);
return 0;
}
有关何时使用malloc
答案 4 :(得分:0)
如果大小不变,这将是有效的。否则,你应该做DShook所说的。另外,确保你在某个时候释放(数组),否则你的程序会泄漏内存。