关于C中的数组

时间:2011-04-13 16:34:28

标签: c arrays

我编写了以下代码(请参阅该问题的代码注释),

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

5 个答案:

答案 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

的详细信息,请参阅this post

答案 4 :(得分:0)

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