不确定我的while循环中发生了什么

时间:2014-05-27 18:04:20

标签: c arrays while-loop scanf

我对编程和学习基础知识完全陌生。我无法弄清楚我的输出发生了什么。请帮忙。

这是我的代码(在mac上使用xcode)

// C Programing
// Program 6C: Basic While loop Example 2
// In this program we will demonstrate the use of basic while loop

#include <stdio.h> 


int main()
{

int values = 1;
int count = 1;
int value_array[values];

printf("Please enter how many values you have:  ");
scanf("%d", &values);

printf("You entered %d values.\n",values);

while (count <= values)
{
printf("Please enter your %d\n value:   ", count);
scanf("%d", &value_array[count]);
count++;
}

count = 1;

while (count <= values)
{
    printf("For the %d value you entered %d.\n", count, value_array[count]);
    count++;
}

return 0;
}
  

这是我的输出(不确定为什么我输入的一些值为31)

请输入您拥有的值:10
您输入了10个值 请输入你的1  值:1
请输入你的2  价值:2
请输入你的3  价值:3
请输入您的4  价值:4
请输入您的5  价值:5
请输入您的6  价值:6
请输入您的7  值:7
请输入您的8  值:8
请输入您的9  价值:9
请输入您的10  价值:10

对于您输入的1值1.
对于您输入的2值2.
对于您输入的3值3.
对于您输入的4值4.
对于您输入的5值5.
对于您输入的6值31 对于您输入的7值1.
对于您输入的8值31 对于你输入的9值9 对于您输入的10值10.
程序以退出代码结束:0

认为我做的一切都是正确的

4 个答案:

答案 0 :(得分:5)

你的数组已经结束了。这样:

int values = 1;
int value_array[values];

创建一个单元素数组,但是然后将其视为一个10元素数组(或更多)。这会调用“未定义的行为”,这基本上意味着所有的赌注都已关闭,程序可能会做任何事情。

答案 1 :(得分:3)

“我觉得我做的一切都很正确” - 相信电脑;首先怀疑自己,最后和永远。如果行为不符合您的期望,那么您需要检查您的期望。

我看到声明了一个values_array,但是我没有看到你使用malloc为它分配任何内存的位置。

声明数组时,values设置为1.然后用户决定要输入10个值,但数组声明不变。当您尝试分配超出第一个数组元素时会发生什么?似乎错了。

自从我上次写C以来已经太久了,但我会检查出来。

答案 2 :(得分:0)

int main()
   {
   int values = 1;
   int count = 1;
   int value_array[values];

问题代码中的缺陷包括上述行。此时,value_array1元素的数组。具体而言,唯一有效的索引是value_array[0]

即使可以在以下行中更改valuesvalue_array中的元素数也将保持不变。它是固定的&#39;只有一个元素。

显然,目的是让value_array引用由用户指定的可变数量的元素。通过将value_array的上述声明更改为以下内容,可以实现此目的:

   int *value_array = NULL;

   printf("Please enter how many values you have:  ");
   scanf("%d", &values);

现在用户已经指定了阵列的元素数量,可以将内存分配给数组&#39;动态&#39;通过添加以下行:

   value_array = malloc(values * sizeof(*value_array));

如果上述行成功,value_array即可使用。但是,如果malloc()失败(由于没有可用的内存等),该怎么办?如果是这样,value_array将指向NULL,而不是指向已分配的内存块。验证malloc()是否成功非常重要。我建议添加一些行(下一个)如下:

   if(NULL == value_array)
      {
      fprintf(stderr, "malloc() failed.\n");
      exit(1);
      }

printf("You entered %d values.\n",values);

while (count <= values)
  {
   printf("Please enter your %d\n value:   ", count);
   scanf("%d", &value_array[count]);
   count++;
   }

count = 1;

while (count <= values)
   {
       printf("For the %d value you entered %d.\n", count, value_array[count]);
       count++;
   }

现在不再需要内存支持value_array,将其释放回系统始终是正确的:

   if(value_array)
      free(value_array);

   return 0;
   }

答案 3 :(得分:0)

我使用了你的代码,它给我这样的错误 使用codeblocks ide

编译它

我一直在初始化我的数组,因为你做了一年以来从未出现错误

据我说你的代码很好