【问题标题】:why the output said variable-sized may not be initialized?为什么说可变大小的输出可能没有被初始化?
【发布时间】:2020-05-23 14:05:16
【问题描述】:
 char letM[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 int nr;
 printf("enter a number between 7 and 15\n");
 scanf("%d", &nr);
 for (int j = 0; j<=nr-5; j++){
   char letter[j] = letM[rand()%26+1];
   printf("%c", letter);
 }

这段代码应该是 nr-5 字母,但是当我运行它时,输出说错误:可变大小的对象可能没有被初始化

【问题讨论】:

  • char letter[j] 中删除[j],你希望你的变量只是一个char
  • @EricPostpischil 我的错。那么,Jack_01,你知道数组索引在 C 中从 0 开始吗​​? letM[rand()%26+1] 中有一个 array 溢出。

标签: c arrays


【解决方案1】:

char letter[j];letter 定义为包含j 元素的数组,每个元素都是char。因为j 是一个变量,所以称为变长数组

char letter[j] = letM[rand()%26+1]; 定义了这样一个数组并尝试使用letM[rand()%26+1]; 的值对其进行初始化。 C 标准不提供初始化可变长度数组,这就是您收到有关它的错误消息的原因。 (必须通过普通的赋值语句或其他方式给它们赋值,而不是通过声明中的初始化器。)

您可能打算将letter 声明为单个char。在这种情况下,请将代码更改为char letter = letM[rand()%26+1];

此外,letM[rand()%26+1] 错误地索引了数组。在 C 中,索引从零开始,因此您不应该加一。使用letM[rand()%26]

【讨论】:

    【解决方案2】:

    您必须在使用之前声明letter 是什么。如果您想存储字母,这里有一个选项。 此外,当您打印letter 时,不要忘记打印letter[j]

         char letter[21];
         char letM[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
         int nr;
         printf("enter a number between 7 and 15\n");
         scanf("%d", &nr);
         for (int j = 0; j<=nr-5; j++){
           letter[j] = letM[rand()%26+1];
           printf("%c", letter[j]);
         }
    

    否则,正如其他建议的那样,如果您只想打印字母,您甚至不需要变量:

     char letM[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     int nr;
     printf("enter a number between 7 and 15\n");
     scanf("%d", &nr);
     for (int j = 0; j<=nr-5; j++){
       printf("%c", letM[rand()%26+1]);
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多