【问题标题】:Let user choose size of array in C [duplicate]让用户在C中选择数组的大小[重复]
【发布时间】:2015-01-26 09:49:32
【问题描述】:

我需要让用户输入一个整数 N,它将成为数组的大小。我厌倦了以下内容:

int N;

printf("Please enter size of array\n");
scanf("%d", &N);

int a[N] = {0};

但是当我这样做时,我得到了以下错误:

error: variable-sized object may not be initialized

有人知道怎么做吗?任何帮助将不胜感激!

【问题讨论】:

  • 改变这个:int a[N] = {0};对此: int a[N]; memset(a,0x00, N*sizeof(int));
  • @user3629249 更简单的是memset(&a, 0, sizeof a);

标签: c arrays


【解决方案1】:

就像错误所说的:你不能初始化一个可变大小的对象(像那样)。您需要在循环中设置各个元素,或使用memset

for(size_t i = 0; i < N; i++){
    a[i] = 0;
}

或:

memset(a, 0, sizeof a);

请注意,memset 要求您包含 &lt;string.h&gt;

编辑sizeof a 更短,看起来更好:)

【讨论】:

  • @Deduplicator 我最近使用malloc 太多了,已编辑。 :)
【解决方案2】:

您不能初始化可变长度数组。

来自 C 标准(6.7.9 初始化)

3 要初始化的实体的类型应该是一个数组 未知大小或不是可变长度的完整对象类型 数组类型

所以写简单

int a[N];

而不是

int a[N] = {0};

如果您需要用零初始化数组,那么您可以使用标头&lt;string.h&gt; 中声明的标准函数memset

#include <string.h>

//...

memset( a, 0, sizeof( a ) );

【讨论】:

    【解决方案3】:

    您需要使用动态分配的数组。

    int N;
    
    printf("Please enter size of array\n");
    scanf("%d", &N);
    
    int *a = malloc(N * sizeof(int));
    

    然后就可以像普通数组一样访问了。

    编辑:在 C99 中,编译器允许动态长度数组,因此您可以使用 memset 或执行一个 for 循环遍历数组并设置每个索引的值

    【讨论】:

    • 他实际上并不需要使用动态分配的数组。 C99 允许并定义了variable-length arrays 的使用,并且由于编译器没有抱怨 vla,它似乎至少在 C99 级别上运行。此外,您的答案并未解决初始化数组的问题。
    • 不知道。谢谢,现在将编辑我的答案。
    • 你可以简单地将 malloc 替换为 calloc 以将数组初始化为零。
    • 非常感谢!完美运行!
    【解决方案4】:

    试试这个:

    int N;
    
    printf("Please enter size of array\n");
    
    scanf("%d", &N);
    
    int a[N];
    
    a[0] = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      相关资源
      最近更新 更多