我正处于学习编码的最开始,并且提出了以下问题让我挠头。在'for'循环的第二个输入处,'control'突然变成那个输入(通过插入printf测试)任何想法为什么,以及如何避免它(除了放弃scanf)
#include <stdio.h>
int sorting[], control,place, a,b,print;
int main()
{
printf("Please enter how many numbers there are in total.\n");
scanf("%d",&a);
sorting[a];
control=a-1;
print=a;
printf("Please start entering your numbers.\n");
for(;print>0;print--)
{
scanf("%d",&sorting[print-1]);
}
P.S。我知道当'a'做得很好时我有一个额外的变量(打印) - 我重新写了一下,看看'control = a'是否以某种方式导致问题。
答案 0 :(得分:2)
当您声明plot foo[2] ...
时,您将其声明为未知大小的数组。如果您没有在任何地方定义数组,那么大小将是1,并且任何高于该数组的索引将超出范围并导致未定义的行为(最有可能覆盖其他数据,如变量)。
有两个解决方案,但我只告诉你一个:不要使用全局变量,并在从用户获得输入大小后定义数组。即。
sorting
答案 1 :(得分:2)
在这个(不完整的)程序中
#include <stdio.h>
int sorting[], control,place, a,b,print;
^^^^^^^^^^^^^^
int main()
{
printf("Please enter how many numbers there are in total.\n");
scanf("%d",&a);
sorting[a];
control=a-1;
print=a;
printf("Please start entering your numbers.\n");
for(;print>0;print--)
{
scanf("%d",&sorting[print-1]);
}
数组sorting
的类型为int [1]
(如果它在翻译单元结束之前未重新声明且类型不完整。它不是一个零大小的数组,因为它是在其他答案中写的)。因此这个表达
sorting[a];
表示如果a
大于0,则尝试访问数组之外的内存。
您可以将数组声明为main中的可变长度数组,而不是数组sorting
的外部定义。例如
#include <stdio.h>
int control,place, a,b,print;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
int main()
{
printf("Please enter how many numbers there are in total.\n");
scanf("%d",&a);
int sorting[a];
^^^^^^^^^^^^^^^
control=a-1;
print=a;
printf("Please start entering your numbers.\n");
for(;print>0;print--)
{
scanf("%d",&sorting[print-1]);
}