关于C中的数组

我写了以下代码(参见问题的代码注释),

#include 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; } 

使用非常量数组大小是有效的C99但不是C90。 有一个较旧的gcc扩展允许它。

请注意,利用这一点可以更加难以检查内存分配是否成功。 将它与用户提供的值一起使用可能并不明智。

您不能像这样在C90中分配动态数组。 您必须使用malloc动态分配它,如下所示:

 int* array = (int*) malloc(sizeof(int) * size); 

您还可以从0开始索引数组而不是1,因此for循环应该像这样开始:

 for(int i = 0; i < size; i++) 

如果你使用malloc方法,你还需要在完成后释放内存:

 free(array); 

也,

C数组索引从0开始,而不是从1开始,并且不包括size

 int i; for(i=0 ; i < size ; i++) // Notice the < and the 0 { //... } 

编译器尝试在编译时计算int arr[size] 。 在这种情况下,arr在堆栈上分配,因此编译器希望提前知道其大小。 相反,您需要使用malloc在堆上分配arr,就像这样。

 #include 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更多信息,请参阅此文章

如果大小不变,这将是有效的。 否则,你应该做DShook所说的。 另外,确保你在某个时候释放(数组),否则你的程序会泄漏内存。