关于C语言中的数组

关于C语言中的数组,c,arrays,C,Arrays,我已经编写了以下代码(请参见问题的代码注释) #包括 int main() { 整数大小; scanf(“%d”,大小(&S); int arr[size];/*这是一个有效的语句吗*/ 对于(int i=1;i您不能像这样在C90中分配动态数组。您必须像这样用malloc动态分配它: int* array = (int*) malloc(sizeof(int) * size); for(int i = 0; i < size; i++) 还可以从0而不是1开始对数组进行索引,因此fo

我已经编写了以下代码(请参见问题的代码注释)

#包括
int main()
{
整数大小;
scanf(“%d”,大小(&S);
int arr[size];/*这是一个有效的语句吗*/

对于(int i=1;i您不能像这样在C90中分配动态数组。您必须像这样用malloc动态分配它:

int* array = (int*) malloc(sizeof(int) * size);
for(int i = 0; i < size; i++)
还可以从0而不是1开始对数组进行索引,因此for循环的开头应如下所示:

int* array = (int*) malloc(sizeof(int) * size);
for(int i = 0; i < size; i++)

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


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

编译器尝试计算
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;
}
#包括
int main()
{
整数大小;
scanf(“%d”,大小(&S);
int*arr=malloc(sizeof(int)*size);

对于(int i=1;i,如果大小为常量,则此选项有效。否则,您应该按照DShook所说的操作。此外,请确保在某个点释放(数组),否则您的程序将泄漏内存。

C
中的数组索引从0开始,而不是从1开始。并且不包括
大小

int i;
for(i=0 ; i < size ; i++) // Notice the < and the 0
{
     //...
}
inti;
对于(i=0;i
OPs代码在C规范的最新扩展中有效,在可用的情况下,这样做比
malloc
更可取。请限定“您不能在C中分配动态数组”在你的回答中。它是完全有效的C99代码。谢谢。你的意思是说,如果我将像int size=5那样编写代码,但它仍然不适合我,请仔细阅读代码,我为我的变量size指定了一个常量,@Alfred Nobel:试试const int size=5或#define size 5(通常首选前者)@艾尔弗雷德诺贝尔:简而言之,不,您不能以这样的方式声明一个数组,它的长度是在运行时确定的。在C++中,<代码>大小<代码>必须声明为“代码> const < /Cord>”,并用一个整数常量表达式(即数字文字)初始化;IOW,它必须在编译时知道。而且它并没有像其他C99特性那样导入到C++0X中。ISTR认为g++继承了gcc扩展。