【问题标题】:C: Simple program compiles fine but crashes at a certain pointC: 简单程序编译正常但在某个点崩溃
【发布时间】:2013-12-13 07:14:44
【问题描述】:

当我使用或显示它们时,所有值似乎都在它们应该在的位置,但由于某种原因,每次我到达某个点(在代码中标记)时,程序就会崩溃。

该程序应该将结构添加到数组中。此结构包含另一个 struct 以及一个表示数量的 int。这些也被存储在一个数组中。

包括 main.c 和崩溃相关的函数。

int main()
{
    int choice;
    int item_num;
    int item_amount;

    printf("*****MEAL PLANNER*****");

    while(choice != 0)
    {
        prepopulate();

        printf("\n\nTo view items, enter 1. \nTo view current menu, enter 2. \nTo add an item to the menu, enter 3. \nEnter 0 to exit.\n\n");
        scanf("%d", &choice);

        if(choice > 0 && choice < 5)
        {
            switch(choice)
            {
            case 1 : printf("\nView Items\n\n");

                displayAllFoodStuff();

                break;

            case 2 :printf("\nView Current Menu\n\n");
                display_meal();
                break;

            case 3 :printf("\nAdd Item to Menu\n\n");
                printf("Enter item number.\n");
                scanf("%d", &item_num);
                printf("Enter item amount.\n");
                scanf("%d", &item_amount);
                if(item_num <= fs_count)
                {
                    printf("Enter 1 to confirm.\n");
                    scanf("%d", choice);
                    fflush(stdin);
                    ////////CRASHING HERE!!!////////

                    if(choice == 1)
                    {
                        choose_food_item(food_list[item_num], item_amount);
                    }
                    break;

                }
                else
                {
                    printf("\nThat is not a valid entry.\n");
                }
                break;



            default: choice = 0;
                break;
            }
        }

    }

    return 0;
}

函数

//Define 'add_food_plan_item' function.
void add_food_plan_item(food_plan_item  fs)
{
    meal[item_count] = fs;
    item_count++;
}

//Define 'choose_food_item' function.
void choose_food_item(food_stuff fs, int qty)
{
    food_plan_item fpi;
    fpi.fs = fs;
    fpi.qty = qty;
    add_food_plan_item(fpi);
}

提前感谢所有帮助。

【问题讨论】:

  • 你能推荐一个好的免费的吗? (这在 cmets 中是允许的,对吧?)

标签: c arrays struct crash


【解决方案1】:

您将选择传递给scanf,但您打算传递&choice。您的代码应为:

scanf("%d", &choice);

发生的情况是 scanf 需要一个地址才能将值写入。您传递的是一个值而不是值的地址,因此 scanf 将该值视为地址。因此,假设选择是一个值为 0 的变量。传递选择的值而不是其地址会导致 scanf 尝试写入地址 0。这通常会导致分段错误。

【讨论】:

  • 我知道这会简单得令人尴尬。谢谢你。当它允许我时,我会接受答案。
  • 以失败的原因回答...我喜欢它:)
  • 哇!谢谢你解释。我喜欢这个地方!
【解决方案2】:

scanf() 将指针指向它读取输入的变量。

您可以使用&amp; 获取choice 的地址:

scanf("%d", &choice);

【讨论】:

    【解决方案3】:

    fflush(stdin); 是未定义的行为,这可能是导致崩溃的原因!!!

    也正如其他人指出的那样,您在scanf 中错过了&amp;(操作员地址)

    另外,不要使用fflush(stdin),如果您想清除stdin,您可以执行以下操作...

    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    

    【讨论】:

    • 它在 C 规范中未定义,但在例如Linux 使用 glibc 和 Windows。
    • @JoachimPileborg:这是我学到的新知识。不知道这个...根据这篇文章,stackoverflow.com/a/11604639/1814023 谢谢
    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多