我是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”是用户键入的内容。但是,它改为随机数。我想知道原因。
答案 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);
}
}