分段故障核心与结构一起倾倒

时间:2016-07-02 01:51:35

标签: c++

我有很多警告,当我编译时,我得到一个分段故障核心转储。我确信它与指针或声明有关。

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);
}
}

1 个答案:

答案 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";

好一点,但仍然错了。 namechar *。字符串文字是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()必须使用&运算符通过其地址传递。此外,quantitydouble,不适用于“%d”int转换说明符。

这里有太多问题,甚至可以猜测这段代码应该做什么。

我认为令人印象深刻的是,您的编译器实际上已经设法编译它,而没有错误输出并拒绝生成具有所有这些问题的目标文件。无论编译器是什么,我希望我永远不必使用它。我希望我的编译器大声地对我大喊大叫,如果我做的话甚至有些错误。