填充数组的代码突然变化变量(C)

时间:2016-02-17 11:55:30

标签: c arrays variables

我正处于学习编码的最开始,并且提出了以下问题让我挠头。在'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'是否以某种方式导致问题。

2 个答案:

答案 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]);
    }