2016-07-02 8 views
-2

私は多くの警告を受けています。コンパイルすると、セグメンテーションフォルトのコアがダンプされます。ポインタや宣言と関係があると確信しています。セグメンテーションフォールトコアが構造体でダンプされる

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

違反はありませんが、このコードは、誰もが良い答えを提供するためにあまりにも多くの方法で壊れています。あなたが取り組んでいる書籍/クラスを再検討する必要があります。 – kfsone

答えて

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]; 

これはそれほど上の3つのItem S、4つのItemの配列としてbookのアレイとしてcartを宣言、および。 bookitemへのポインタに崩壊するのは事実ですが、あなたがここで達成しようとしていたものであれば、それは正しいものではありません。

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と評価されます。からの割り当てによって、どこかで、初期化されなければならない、リンカーは、同一の文字列リテラル

2)typeをマージする必要があり

1):これは今までにおそらくtrueに評価するために、ドミノの数が右方向に入らなければなりません別のリテラル文字列 "type"。

scanf("please enter quantity %d", book->quantity); 

ここでは2つの異なるエラーがあります。まず、scanf()への変換パラメータは、&演算子を使用して、そのアドレスによって渡されなければなりません。さらに、quantitydoubleであり、 "%d" int変換指定子では機能しません。

このコードが何をすべきかを推測できるようにするには、あまりにも多くの問題があります。

あなたのコンパイラがこれらの問題をすべて抱えてオブジェクトファイルを生成することを拒否して拒否することなく、実際にこのコンパイルを実際に行ったことは非常に印象的だと思います。どんなコンパイラでも、私はそれを使う必要はないと思っています。私のコンパイラが私に叫ぶのが大声で、もし私がやっていることがやや間違っていても大丈夫です。

関連する問題