c - 运行程序时出现“分段错误(核心转储)”
问题描述
(对不起,我的英语不好顺便说一句)好吧,我正在复制这段代码的解决方案。我的代码与解决方案相同(代码没问题,做得很好),但是当我运行程序时,会出现一条消息,上面写着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;
}
解决方案
您的 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);
推荐阅读
- tabulator - 创建表时重新组合和 setGroupStartOpen
- javascript - 在 mongodb 中一次在 2 个集合中插入大数据
- python - 如何创建一个自下而上的合并排序函数来改变输入列表?
- java - 检查特定字符串的 EditText 内容
- python-3.x - 读取文件将信息放入 url 请求并获取特定信息
- uwp - 通用 Windows 部署问题
- c - C 编译器无法识别 unsigned long
- excel - 需要使用 vba 代码进行审计跟踪的代码
- c# - 如何脱离 EventToCommandBehavior?
- python - 单个ffts的numpy fftn顺序