我对编程和学习基础知识完全陌生。我无法弄清楚我的输出发生了什么。请帮忙。
这是我的代码(在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
认为我做的一切都是正确的
答案 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_array
是1
元素的数组。具体而言,唯一有效的索引是value_array[0]
。
即使可以在以下行中更改values
,value_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
编译它我一直在初始化我的数组,因为你做了一年以来从未出现错误
据我说你的代码很好