2012-05-02 6 views
0

構造体内のポインタをNULLに設定する際にいくつか問題があります。私はセグメンテーション違反をしている。これを引き起こしていると私はそれを修正する方法は?なぜこのポインタをNULLに設定しないのですか?

typedef struct data_{ 
    void *data; 
    struct data_ *next; 
}data_el; 

typedef struct buckets_{ 
    char *key; 
    data_el *head_data_p; 
}buckets; 

typedef struct hash_table_ { 
    /* structure definition goes here */ 
    int (*hash_func)(char *); 
    int (*comp_func)(void*, void*); 
    buckets **buckets_array; 
} hash_table, *Phash_table; 

int i,size; 
size = 10; 

table_p -> buckets_array = (buckets **)malloc(sizeof(buckets)*(size+1)); 

for(i = 0; i < size; i++){ 
/*Getting segmitation falut here*/ 
table_p -> buckets_array[i] -> key = NULL; 
table_p -> buckets_array[i] -> head_data_p = NULL; 
あなたは交換する必要があり
+0

1. 'table_p'は何ですか? 2. 'malloc'の戻り値をキャストしません。3.二次元配列 –

+0

を残しておくべきポインタに一次元配列を入れています。' Phase_table table_p'です。 –

答えて

2

あなたはbuckets_arrayを初期化していないので。ポインタはまだ何も指していないので、指しているものを試して修正するとエラーになります。

あなたのポインタの配列、また、個々のポインタを初期化する必要があります。

table_p -> buckets_array = malloc(sizeof(buckets *) * (size+1)); 

for(i = 0; i < size; i++) { 
    table_p -> buckets_array[i] = malloc(sizeof(bucket)); 
    table_p -> buckets_array[i] -> key = NULL; 
    table_p -> buckets_array[i] -> head_data_p = NULL; 
} 
+0

また、彼は何も指さずに 'table_p'を逆参照していると思います。例に追加するかもしれません。 –

+0

@Seth、そうですが、OPでは 'table_p'の宣言も表示されません。私はそれがどんなタイプなのか知らない。 –

+0

彼は '= malloc ... 'を含まない質問にコメントしました。なぜなら、彼はそれを初期化しなかったと思います。 –

1

buckets **buckets_array; 

で:

buckets *buckets_array; 

そして:

(buckets **)malloc(sizeof(buckets)*(size+1)); 

付:

(buckets *)malloc(sizeof(buckets)*(size+1)); 

も:

table_p -> buckets_array[i] -> key = NULL; 
table_p -> buckets_array[i] -> head_data_p = NULL; 

付:

table_p -> buckets_array[i] . key = NULL; 
table_p -> buckets_array[i] . head_data_p = NULL; 
+0

'malloc'からキャストを削除する必要があります –

+0

ありがとうございます。やってみます。 –

関連する問題