【问题标题】:Scanf array limit in C?C中的Scanf数组限制?
【发布时间】:2013-02-02 21:15:57
【问题描述】:

我在 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下标需要数组或指针类型

【问题讨论】:

  • 你需要使用malloc,因为limit在编译时是未知的(或者进入VLA领域)。
  • 编译为 C99 或 C2011。可变长度数组不在 C89 中。
  • 下次不要发布问题的编辑作为答案,只需使用编辑功能。现在检查我的答案。

标签: c arrays scanf variable-length-array


【解决方案1】:

自 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]);

【讨论】:

    【解决方案2】:
    int *arr=malloc( limit*sizeof(int) );
    

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

    【讨论】:

    • @user1814358 : 你确定是错误的代码,还是 int arr=(int)malloc....?
    【解决方案3】:

    C89 和更早版本的 C 不支持数组的运行时大小。您需要在编译器中打开 C99(或更高版本)支持。

    如果您使用的是 Linux,您可以输入:

    gcc -std=c99
    

    c99
    

    编译为 c99 编写的代码。

    Setting std=c99 flag in GCC

    【讨论】:

      【解决方案4】:

      你应该使用malloc:

      printf("Type limit: ");
      scanf("%i",&limit);
      int *arr = malloc(sizeof(int) * limit);
      

      【讨论】:

      • 谢谢我使用它并且工作:int arr = (int)malloc(limit*sizeof(int));谢谢。问题解决了。
      • 我同意@qPCR4vir。此外,您应该删除malloc 之前的类型转换。这不是一个好习惯......
      • @ViníciusGobboA.deOliveira 如果我删除演员表,那么我有错误。
      • @user1814358 有趣...您应该有警告,而不是错误...请发布您的代码,可能还有其他问题...
      • @user1814358:您是将此代码编译为 C 还是 C++? C++ 要求你转换malloc 的结果,C 不需要。这也可以解释为什么您不能在原始帖子中使用 VLA。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多