0

我在 C 中有一些小错误:

错误:表达式必须有一个常量值

我知道,这意味着我的限制必须有一个恒定值,但是当我遇到这种情况时,我该如何解决呢?

printf("Type limit: ");
scanf("%i",&limit);
int arr[limit];

谢谢。

编辑

好的,伙计们,另一个问题,对不起,如果我是垃圾邮件。

    int num,limit,i;
    printf("Type limit: ");
    scanf("%i",&limit);
    int *arr = (int*)malloc(limit*sizeof(int));
    for(i=0;i<limit;i++)
    {
        printf("Type num %i: ",i);
        arr[i] = scanf("%i",&num);
    }
    system("pause");
    return 0;

错误 4 错误 c2109 下标需要数组或指针类型

4

4 回答 4

5

你应该使用malloc

printf("Type limit: ");
scanf("%i",&limit);
int *arr = malloc(sizeof(int) * limit);
于 2013-02-18T12:31:55.833 回答
4

自 C99 起允许使用具有自动存储持续时间的可变长度数组。在 C89 中,无法分配具有自动存储持续时间的数组,其大小在编译时是未知的。用于malloc动态分配:

printf("Type limit: ");
scanf("%i", &limit);

int* arr = malloc(limit * sizeof(int));

free(arr)一旦不再需要它,不要忘记调用以释放此内存。


关于使用循环中从标准输入读取的值初始化此数组的问题:

for(i = 0; i < limit; ++i)
    arr[i] = scanf("%i", &num);

读取每个值,将其存储到num变量中,然后1分配到arr[i],因为scanf返回“成功匹配和分配的输入项数”(在本例中为 1)。您可以直接读入数组元素:

for(i = 0; i < limit; ++i)
    scanf("%i", &arr[i]);
于 2013-02-18T12:31:31.443 回答
1

C89 and earlier versions of C didin't support run-time sizing of arrays. You need to turn on C99 (or newer) support in your compiler.

If you are using Linux you can either type:

gcc -std=c99

or

c99

to compile code written for c99.

Setting std=c99 flag in GCC

于 2013-02-18T12:38:34.510 回答
0
int *arr=malloc( limit*sizeof(int) );

这将为您的数组在堆中分配足够的内存limit int。但是这个数组是“动态的”(大小是在运行时设置的),当你不再需要它时,你有责任“<code>释放”这个内存。您的变量 arr 将只是指向该内存的指针。 int arr1[10];另一方面int,在堆栈中为 10 分隔一个内存空间,您的变量arr1就是该内存。编译器需要知道大小。如果你把它传递给一个函数,int*它会“衰减”到int*,一个指向第一个元素的指针arr1[0].

于 2013-02-18T12:32:31.537 回答