2016-05-04 8 views
-1

(それはあなたの情報のためのスーパーマーケットのトラフィックをシミュレート)などoperations.Hereが私のコードで、追加、削除、削除やって:リンクリスト

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
typedef struct cash_queue cash; 
typedef struct client client; 
typedef struct item item; 
int k,c;//k== cash registers,c == customers 
struct item{ 
    int value; 
    struct item* next; 
}; 

struct cash_queue{ 
    int cash_num; 
    struct client *first; 
    struct cash_que* next; 
}; 

struct client{ 
    int client_num; 
    int items; 
    struct item *fitem; 
    struct client* next; 
}; 
void create_item(item* fitem){ 
    item *item,*cur; 
    cur=fitem; 
    item=malloc(sizeof(item)); 
    printf("give product value\n"); 
    int v; 
    scanf(" %d",&v); 
    item->value=v; 
    printf("value: %d\n",item->value); 
    item->next=NULL; 
    while (cur->next) 
    cur=cur->next; 
    cur->next=item; 
} 

void create_queue(client* first){ 
    client *client,*cur; 
    cur=first;  
    client=malloc(sizeof(client)); 
    printf("how many items this client has?\n"); 
    int x,i; 
    scanf("%d",&x); 
    client->items=x; 
    client->next=NULL; 
    client->fitem=malloc(sizeof(item)); 
    for (i=1;i<=x;++i) 
    create_item(client->fitem); 
    while (cur->next){ 
    cur=cur->next; 
    } 
    cur->next=client; 
} 
int main(){ 
    cash* ncash; 
    ncash=malloc(sizeof(cash)); 
    ncash->cash_num=1; 
    ncash->next=NULL; 
    ncash->first=malloc(sizeof(client)); 
     printf("give the number of starting customers\n"); 
    scanf("%d",&c); 
    int i; 
    for(i=1;i<=c;++i) 
    create_queue(ncash->first); 
    } 

私はこのコードを私のプログラムはaborted.here取得実行しようとする正確な出力です:

give the number of starting customers 
3 
how many items this client has? 
1 
give product value 
    2 
value: 2 
aa: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char    *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size  & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed. 
    Aborted 

この出来事で、どのように私はそれを修正することができますなぜあなたは私に言うことはできますか?ありがとうございます。私のコードで修正する必要がある他の問題はありますか?

+0

'malloc()'関数にエンコードされたアサーションは失敗しました。その関数が意図したとおりのアサーションを使用していると仮定すると、その関数が依存している(そしてエラーメッセージのテキストで与えられている)想定される不変量は、実行時には満たされないことがわかります。これは、あなたのコードが、動的に割り当てられた記憶域の境界を越え、ポインタが一度指摘されたブロックが解放された後にポインタを使用したり、ポインタを二重に解放したりしたことが原因です。 –

+1

'item = malloc(sizeof(item));' - > 'item = malloc(sizeof * item);'を開始します。あなたのオブジェクトにあなたの型と同じ名前をつけないようにするのが良い理由、あるいはそれ以上のこと:typedefを全く使わないでください) – wildplasser

+1

私は気付いたことのひとつに 'void create_item(item * fitem)'があります。それは新しいアイテムを構築するようです。しかし、実際にはそのアイテムを返すわけではありません。それはそれを失う。新しい項目を返すために 'fitem'パラメータを使いたいと思っていたら、これはやり方ではなく、うまくいきません。 –

答えて

1

私のコメントに書いたように、エラーメッセージはおそらくあなたが何らかの方法で動的に割り当てられたメモリを誤用していることを意味します。あなたのコードを見ると、実際にはそうであるように見えます。

typedef struct foo foo; 

struct foo { 
    // elements ... 
}; 

void f() { 
    foo *foo; 
    foo = malloc(sizeof(foo)); 
    // ... populate foo .. 
} 

はあなたがそこにあまりにも巧妙であることを試みることによって自分自身、またはコンパイラ、またはその両方を混同している:あなたは、このパターンの複数のインスタンスを持っています。 malloc()呼び出しを含むステートメントのfooは、同じものです。変数fooは、タイプstruct foo *のポインターです。 struct fooのサイズがシステム上のポインタのサイズと同じでない限り、それは間違ったことです。構造体がポインタより大きい場合、そのメンバのいくつかに書き込むと、実際に割り当てられた境界をオーバーランします。

これに対処する方法はいくつかあります。私は、あなたが名前をつける際に少し独特であることを確かにお勧めします。私はtypedefを使わないことをお勧めします。あなたのタイプはそれほど複雑ではないので、コードの分かりやすさが損なわれます。それはへのターゲットポインタはオブジェクトの種類のサイズの倍数であるバイト数を割り当てるに明確であることを確認し

bar = malloc(n * sizeof(*bar)); 

:さらに、私はのためにすべてのmalloc()呼び出しをこのフォームをお勧めします実際にはbarのタイプに直接依存しません。全体的には、

struct bar { 
    // elements ... 
}; 

void f() { 
    struct bar *temp_bar; 
    temp_bar = malloc(sizeof(*temp_bar)); 
    // ... populate temp_bar .. 
} 
+0

あなたは、変数の名前を変更するか、 'typedef'を使って止めるべきですか? –

+0

私の答えの提案は累積的です。私は、私の例に示すように、それらのすべてを一緒にお勧めします。しかし、実際の問題を解決するには、いずれか1つで十分です。しかし、注意してください:あなたのコードには、質問自体に関するコメントのいくつかで説明されているように、あなたが尋ねたもの以外の追加の問題があります。 –

+0

お返事ありがとうございました。とても役に立ちました。私のコードにはさらに問題があると言われました。 –