C代码 - 为什么输出在我的代码中返回了意外值?

时间:2017-10-20 08:07:01

标签: c

我是C首发,刚刚学习了编程的基础。当我练习编码时,我注意到一些奇怪的意外输出,我不知道它的原因,甚至无法描述问题所在。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
  int numberEntered = 0;
  int index = 0;
  char input[32];
  int TotalNum = 0;
  int x = 1;
  int array[x];

  printf("Please enter the size of the array: ");
  fgets(input,32,stdin);
  x = atoi(input);

  for(index =0; index < x; index++)
  {
      printf("\nPlease enter your number:");
      fgets(input,32,stdin);

      numberEntered = atoi(input);
      printf("The number you entered is : %d\n",numberEntered);


      array[index] = numberEntered;

      TotalNum ++;
   }

  for(index = 0; index < TotalNum; index++)
  {
      printf("array[%d] = %d\n",index,array[index]);
  }
    return 0;
}

用户输入x = 15;然后用户输入1到15之间的数字; 输出是:

array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
array[5] = 6
array[6] = 7
array[7] = 668977
array[8] = 9
array[9] = 10
array[10] = 11
array[11] = 12
array[12] = 13
array[13] = 14
array[14] = 15

我最初期望数组[7]应该给出一个数组[7] = 8的输出,因为数字“8”是用户键入的内容。但是,它改为随机数。我想知道原因。

4 个答案:

答案 0 :(得分:3)

int x = 1;
int array[x];

printf("Please enter the size of the array: ");
fgets(input,32,stdin);
x = atoi(input);

此行更改x的值,但不更改array的大小。您只能在声明数组时为数组提供大小。 *)

将此重新排序为以下内容:

printf("Please enter the size of the array: ");
fgets(input,32,stdin);
int x = atoi(input);
int array[x];

另一方面,atoi()不适合检查错误(您应该在交互式输入上执行此操作)。请改用strtol(),并确保阅读the manpage,以便充分利用所有可能性来检测错误。

*)请注意,您在此处使用的功能称为可变长度数组(VLA),但单词&#34; 变量&#34;仅表示数组的大小不是编译时常量意味着您可以在数组存在后更改大小 - 这将是动态数组,您必须自己在C中实现(使用{{1} }和malloc())。

另请注意,VLA虽然非常普遍,但不支持,但C11使它们成为可选功能。如果您没有可用的VLA,则必须使用足够大的固定大小数组或使用realloc()自行分配数组,在这种情况下它看起来像

malloc()

在执行此操作时,请勿忘记int x = atoi(input); int *array = malloc(x * sizeof *array); 检查array,并在完成此操作时忘记NULL

答案 1 :(得分:1)

咦?

执行此操作时:

int x = 1;
int array[x];

你得到一个名为array的1元素数组。稍后更改x的值不会神奇地调整数组的大小。在之后的array[x]声明获取x的正确值。

并添加对I / O调用的检查,它们可能会失败。

答案 2 :(得分:0)

int x = 1;
int array[x];

它限制了数组的大小。不要这样做。

答案 3 :(得分:0)

什么?

  int x = 1;
  int array[x];

  // .....

  x = atoi(input);

您是否确实为x变量分配新值将调整已声明的array变量???

不,您必须在知道其大小时声明该数组。

  int x;

  // .....

  x = atoi(input);

  int array[x];

或者更好的是,从堆中分配一个新数组,尤其是。有一天x将获得值时......

  int arraylength;

  // .....

  arraylength = atoi(input);

  if (arraylength > 0)     // sanity check
  {
      int* array = malloc (arraylength * sizeof(int));
      if (array != NULL)   // allocation succeeded
      {
          // use array[i]...

          // and relese the array when no longer needed
          free (array);
      }
  }