插入变量时C程序崩溃了

时间:2016-01-19 01:38:59

标签: c

我的代码有问题。它应该取自用户数量的数组,用户应该在1-100范围内写出他想要的数字。

此程序还应显示最小和最高的数字。如果我想要一个包含7个以上数字的数组,那么当我输入数字时它会崩溃。

每次遇到7号,程序都会崩溃。我不知道它为什么不起作用。

#include <stdio.h>
#include <stdlib.h>

int n, i, a;
int main ()
{
    int tab[n];

    printf("\nhow many elements you want to have?\n");
    do
    {
        scanf ("%d", &n);
        if ((n>30 || n<1))
            printf("\ntoo high or too low\n");          
    }
    while ((n<1 || n>30));
    printf("\nyour number please:\n");
    for(i = 0; i < n; i++)
    {
        do
        {
            printf("\nelement %d:", i+1);
                scanf("%d", &a);
            if ((a < 1 || a > 100))
                printf("\nnumber too high or too low\n");
            tab[i]=a;
        }
        while((a < 1 || a > 100));
    }
    printf("\nyour numbers:");
    for (i=0; i<n; i++)
    {
        printf("\n%d", tab[i]);
    }

    int min = tab[0];
    int max = tab[0];
    for (i = 0; i<n; i++)
    {
        if (tab[i]> max)
        max = tab[i];
        if(tab[i]< min)
        min = tab[i];
    }
    printf("\nsmallest: %d", min);
    printf("\nbiggest: %d", max);
}

3 个答案:

答案 0 :(得分:1)

这里的问题是这个声明:

int tab[n];

您正在声明一个可变长度数组(自C99起可用),其未初始化值为长度。我知道您希望为stdin中要存储的数字腾出空间,但这不是正确的方法。

我看到两个解决方案:

  • 简单的一个,选择最大固定数量的数字(因为您允许最多30个值,因此情况就属于这种情况)并将声明更改为int tab[30]
  • 使用动态分配的内存,例如看看here

答案 1 :(得分:0)

如果您在声明printf("%d",sizeof tab);之后添加int tab[n],程序将输出0

您在int n;之外写了main(),使其成为全局变量,默认情况下初始化为零,但在使用前没有给它任何其他值它在语句int tab[n];中,因此在您的情况下它等于int tab[0]

要使用VLA,您必须在用户提供 tab[n]后声明n

此错误导致未定义的行为,允许任何事情发生。因此,当您输入第二个数字时,您的程序可能会崩溃,或者如果您真的(非)幸运,它将永远不会崩溃。 7号没有任何神奇的力量。

答案 2 :(得分:-1)

你必须用C

来规定你的数组长度
tab[100];