我有很多警告,当我编译时,我得到一个分段故障核心转储。我确信它与指针或声明有关。
struct Item
{
char *type;
char *name;
double *price;
double quantity;
};
int main(){
struct Item cart[3];
struct Item book[4];
struct Item clothing[5];
struct Item sports[6];
book->name = "harry potter";
strcpy(book->price, "100");
clothing->name = "shirt";
strcpy(clothing->price, "15");
sports->name = "football";
strcpy(sports->price, "20");
scanf("enter Item %c", cart->type);
if (cart->type == "book"){
scanf("please enter quantity %d", book->quantity);
printf("%s %d %d", book->name, book->price, book->quantity);
}
if (cart->type == "clothing"){
scanf("please enter quantity %d", clothing->quantity);
printf("%s %d %d", clothing->name, clothing->price, clothing- >quantity);
}
if (cart->type == "sports"){
scanf("please enter quantity %d", sports->quantity);
printf("%s %d %d", sports->name, sports->price, sports->quantity);
}
}
答案 0 :(得分:0)
您不应忽略编译器警告。编译器有很好的理由发出这些警告。
strcpy(book->price, "100");
price
成员是指针double *
。它也没有初始化。这会尝试将字符串复制到指向double
的未初始化指针。
这个代码很可能会崩溃,这是第一个声明。
此外book
是一个数组。它不是指针:
struct Item cart[3];
struct Item book[4];
struct Item clothing[5];
struct Item sports[6];
这将cart
声明为三个Item
的数组,book
为4个Item
的数组,依此类推。确实,book
衰变到指向item
的指针,但无论你想在这里完成什么,它都是不对的。
strcpy(sports->price, "20");
更多未定义的行为。 price
类成员未初始化,它是指向double
的指针,您尝试strcpy()
一个字符串。不会工作。
sports->name = "football";
好一点,但仍然错了。 name
是char *
。字符串文字是const char *
。编译器正确地警告您在这里丢失const
限定符。
if (cart->type == "book")
无论你如何初始化type
,除非编译器/链接器合并重复的字符串文字,否则不太可能评估为true。
这会将type
类成员的原始指针地址与“book”字符串文字的地址进行比较。即使type
指向字符串“book”,这也将评估为false,直到它恰好是相同的字符串文字。为了能够评价为true
,许多多米诺骨牌必须朝着正确的方向发展:
1)链接器必须合并相同的字符串文字
2)type
必须通过另一个文字字符串“type”的赋值在某处初始化。
scanf("please enter quantity %d", book->quantity);
这里有两个不同的错误。首先,转换参数scanf()
必须使用&
运算符通过其地址传递。此外,quantity
是double
,不适用于“%d”int
转换说明符。
这里有太多问题,甚至可以猜测这段代码应该做什么。
我认为令人印象深刻的是,您的编译器实际上已经设法编译它,而没有错误输出并拒绝生成具有所有这些问题的目标文件。无论编译器是什么,我希望我永远不必使用它。我希望我的编译器大声地对我大喊大叫,如果我做的话甚至有些错误。