【问题标题】:C program crashes while I insert variables插入变量时 C 程序崩溃
【发布时间】:2016-04-24 08:35:09
【问题描述】:

我的代码有问题。它应该从数组中的用户数量中获取,并且用户应该在 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);
}

【问题讨论】:

  • int tab[n]; n 包含什么?
  • 启用编译器警告!然后阅读它们,理解它们并修复你的代码。

标签: c


【解决方案1】:

这里的问题是这个声明:

int tab[n];

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

我看到了两种解决方案:

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

【讨论】:

  • 全局变量初始化为零,因此声明了一个长度为0的数组。
【解决方案2】:

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

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

要使用 VLA,您必须声明 tab[n] n 是用户给出的。

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

【讨论】:

    【解决方案3】:

    你必须在 C 中指定你的数组长度

    tab[100];
    

    【讨论】:

    • 在写出事实上不正确的答案之前,请先做一些研究并了解可变长度数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多