2016-12-18 5 views
-2

Cで二重リンクされたジェネリックリストを作成しました。データを格納するのにintsを使用して作成しましたが、今は一般的にする必要があります。voidポインターでmemcpyを使用したときのセグメンテーションフォールト - C

私はリストとノード変数の型を作成している:私は、ノード内の項目に値を挿入すると問題が生じています

struct node{ 

    struct node *prev; 
    struct node *next; 
    void *item; 

}; 

struct list{ 

    struct node *first; 
    struct node *current; 
    struct node *last; 
    int itemSize; 

}; 

を。私は現在のポインタの前にnewNodeを挿入する次のコードを持っています。

void insertBefore(list *l, void *p){ 

    struct node *new = (struct node*) malloc(sizeof(struct node)); 
    new->item = malloc(l->itemSize); 

    memcpy(new->item,p,l->itemSize); 

... 

ボイドポインタpはあるデータであり、itemSizeは前記データのバイト数である。もちろん、これはinsertBeforeコード全体ではありませんが、そのロジックは、アイテムの型としてintを使ってリストを操作するようになっているので、健全でなければなりません。

私がこれを呼び出すと、セグメンテーションフォルトが発生します:11エラーと私はなぜそれがわかりません。

ご協力いただければ幸いです。

編集:ワンセグ障害が、このinsertBefore

list *newList(int b){ 

    list *l = (list*)malloc(sizeof(list)); 
    l->itemSize = b; 
    l->first = NULL; 
    l->current = NULL; 
    l->last = NULL; 

    return l; 
} 

とでmemcpyであるが、私は、スタッフが戻って起こっている場所であるかもしれないことと呼ばれる他のコードの一部を含めました

メインに呼び出されます。

list *l = newList(sizeof(int)); 
insertBefore(l, (void *)3); 
... 
+0

を理由だけであなたのリストのユーザーが自分のデータを割り当て、割り当て解除を心配させませんか?データを格納するために 'malloc'を使ってそれらを嫌うことは厳しく制限されています。リストに挿入するときは有効なデータポインタを要求するだけでなく、リストオブジェクトを作成するときにデータを解放するためのコールバックを要求します。 – StoryTeller

+0

私はライブラリモジュールを作成しようとしています。後でユーザーがノードや何かを見ない場所で再利用できるようにし、必要に応じてデータ間を前後に移動し、できるだけシンプルに保ちます。 –

+0

(私はこれについてアイデアを作りませんでした、私はそれを作る必要があると言われた、私は完全にあなたに同意する!) –

答えて

0

あなたのコードでは、あなたは、セグメンテーションを取得しているmemcpy(new->item, 3, sizeof(int)) にしようとしますなぜなら3は参照不可能なアドレスではないからです。

代わりに、あなたがこれを行う必要があります。

int x = 3; 
insertBefore(l, &x); 
関連する問題