运行程序时出现“分段错误(核心已转储)”

时间:2019-04-10 19:49:53

标签: c core principles

(对不起,我的英语不好!) 好吧,我正在复制此代码的解决方案。我的代码与解决方案相同(代码正常,做得很好),但是当我运行该程序时,它会显示一条消息,提示Segmentation fault (core dumped)。我不知道如何向您展示我的程序的截图,但是我的代码似乎还不错。 当我运行程序时,它会在询问商品数量时完成。然后出现以下消息:Segmentation fault (core dumped)

#include <stdio.h>

#define NUM 5
#define MAX_WAGON_CAPACITY 0.85
#define MAX_WAGON_CAPACITY_ANIMALS 0.5
#define LIMIT1 500
#define LIMIT2 2500
#define FRAGILE 1.10
#define DANGEROUS 1.15
#define FIRST_PRICE 0.50
#define SECOND_PRICE 0.45
#define THIRD_PRICE 0.40

typedef enum { FOOD, CHEMICAL, ANIMALS, VEHICLES,
               ELECTRONICS, CONSTRUCTION, OTHERS } tGoodType;
typedef enum { FALSE, TRUE } boolean;

int main(int argc, char **argv) {
    int idGood;
    float volumeGood;
    tGoodType typeOfGood;
    boolean isFragile;
    boolean isDangerous;
    float train [NUM];
    int nWagons;
    float volumeTrain;
    float price;  
    float surchargeFragile;
    float surchargeDangerous;

    printf("Good identifier: \n");
    scanf("%d", &idGood);
    printf("\nInsert volume of Good\n");
    scanf("%f", volumeGood);
    printf("\nInsert Good type (0-FOOD, 1-CHEMICAL, 2-ANIMALS, 3-VEHICLES, 4-ELECTRONICS, 5-CONSTRUCTION, 6-OTHERS)\n");
    scanf("%u", &typeOfGood);
    printf("\nIs the Good fragile? (0-FALSE, 1-TRUE)\n");
    scanf("%u", &isFragile);
    printf("\nIs the Good dangerous) (0-FALSE, 1-TRUE\n");
    scanf("%u", &isDangerous);
    printf("\nThe maximum length of the train is>> ");
    scanf("%f", train[0]);
    printf("\nThe length of the locomotive is>> ");
    scanf("%f", train[1]);
    printf("\nThe length of each wagon is>> ");
    scanf("%f", train[2]);
    printf("\nThe space between each wagon is>> ");
    scanf("%f", train[3]);
    printf("\nThe volume of a wagon is>> ");
    scanf("%f", train[4]);

    nWagons = (int)((train[1] - train[2]) / (train[3] + train[4]));

    if (typeOfGood == 2)
        volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY_ANIMALS;
    else
        volumeTrain = nWagons * train[4] * MAX_WAGON_CAPACITY;

    price = 0.0;
    surchargeFragile = 0.0;
    surchargeDangerous = 0.0;
    if (volumeTrain >= volumeGood) {
        if (volumeGood > 0 && volumeGood < LIMIT1) { 
            price = volumeGood * FIRST_PRICE;
        } else if (volumeGood >= LIMIT1 && volumeGood <= LIMIT2) {
            price = volumeGood * SECOND_PRICE;
        } else {
            price = volumeGood * THIRD_PRICE;
        }
    }
    if (isFragile == 1) {
        surchargeFragile = (price * FRAGILE) - price;
    }
    if (isDangerous == 1) {
        surchargeDangerous = (price * DANGEROUS) - price;
        price = price + surchargeFragile + surchargeDangerous;
    }   

    if (price > 0.0) {
        printf("The Good id is %d", &idGood);
        printf("The number of wagons is %d", &nWagons);
        printf("The price for the good is %f", &price);
    } else {
        printf("The good does not fit the train");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的scanf中有几个错误,会产生分段错误,它们由编译器指示:

c.c:38:1: warning: ‘volumeGood’ is used uninitialized in this function [-Wuninitialized]
scanf("%f", volumeGood);
^~~~~~~~~~~~~~~~~~~~~~~

c.c:38:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", volumeGood);

因为 volumeGood 的未定义值用作 scanf 尝试写入的地址

您可能想要

scanf("%f", &volumeGood);

以及所有这些:

c.c:46:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[0]);
        ^
c.c:48:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[1]);
        ^
c.c:50:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[2]);
       ^
c.c:52:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[3]);
        ^
c.c:54:9: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double’ [-Wformat=]
scanf("%f", train[4]);

因为 train 中的条目的使用方式就像它们包含您想要的地址一样

scanf("%f", &train[0]);
scanf("%f", &train[1]);
scanf("%f", &train[2]);
scanf("%f", &train[3]);
scanf("%f", &train[4]);

当您使用 scanf 及其等效版本时,必须提供要保存值的地址


c.c:84:29: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("The Good id is %d", &idGood);
                             ^
c.c:85:38: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("The number of wagons is %d", &nWagons);
                                      ^
c.c:86:40: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
     printf("The price for the good is %f", &price);

那时候是相反的,您必须提供地址,而必须提供值,

     printf("The Good id is %d", idGood);
     printf("The number of wagons is %d", nWagons);
     printf("The price for the good is %f", price);