2017-10-18 13 views
0

メイン:malloc.c:2405:sysmalloc:アサーション `(old_top == initial_top(AV)& & old_sizeの== 0)|| (unsigned long)old_end & & prev_inuse(old_top)& &(unsigned long)old_end &(pagesize - 1))== 0) 'は失敗しました。Sysmalloc:アサーション

ユーザーが頭や尾にのみ追加できる二重リンクリストを作成しようとすると、私は結局上の美しい流産メッセージを得ることになります。

私はgdbを使ってこれをどのような機能に絞り込んでいますが、実際に何が間違っているのか分かりません。それは、最初のノードを割り当て、その後、それは私にエラーをスローします。次のように
機能は次のとおりです。

data* initD(){ 
    data *D = NULL; 

    D = malloc(sizeof(data*)); 
    if (!D){ 
     printf("Error in allocation of data\n"); 
     exit(0); 
    } 

    D->head = NULL; 
    D->tail = NULL; 
    D->next = NULL; 
    D->prev = NULL; 
    D->val = -1; 

    return D; 
} 
+2

'malloc(sizeof(data *))'? 'sizeof(data)!= sizeof(data *)'の場合はどうなりますか? –

+0

それはなぜでしょうか?メモリ内のいくつかの場所へのポインタです。データはヘッダーファイルで定義されている構造体なので、データのサイズがどのようになるかはわかりません。* – Ohunter

+0

@Ohunterポインタのサイズが固定されています。しかし、あなたの構造のそれはポインタのサイズよりも大きいかもしれません。任意の型のポインタのサイズは同じです。 –

答えて

3

あなたが割り当てられたバッファの外に書いています。

あなたのmallocの呼び出しが間違ったサイズを渡すためです:

D = malloc(sizeof(data*)); // allocate memory for a single pointer 

は次のようになります。

D = malloc(sizeof(data)); // allocate memory for a whole struct 

しかし、その後、あなたが必要としないので、本当に、

D = malloc(sizeof *D); // allocate memory for whatever D points to 

がベストですこの行が正しいことを確認するためのDの宣言を見てください。

+0

は* Dが単なるDへのポインタなので、sizeof(* D)はsizeof(D)と同じではないでしょうか? – Ohunter

+0

@Ohunter '* D'はポインタではありません。 'D'は(* Dへの)ポインタです。そして、いいえ、彼らは同じサイズではありません。 64ビットマシンでは、 'D 'は8バイト(ポインタのサイズ)であり、' * D'は40バイト( 'data'のサイズ:4ポインタ+ 1' val')です。 – melpomene

1

dataポインタ(data*)のメモリを割り当てていますが、メモリにはdataが必要です。 D = malloc(sizeof(data))を使用する必要があります。