2011-11-13 20 views
1

valgrindからエラーが発生しています(実際にはかなりのエラーが発生しています)。Valgrindが構造体へのポインタの配列で無効な書き込みエラー

私は構造体を宣言するために、このコードを使用しています:arrayPtrは、他の構造体へのポインタの配列へのポインタであることを意味する

struct HashTableT { 

HashFuncT hashFunc; 
// array of SortedList's 
SortedListPtr* arrayPtr; 
}; 

typedef struct HashTableT* HashTable; 

。 は、このと後でのためにメモリを割り当てる:

HashTable index; 
index = malloc(sizeof(HashTable)); 
memcheck(index); 
index->hashFunc = func; 
index->arrayPtr = malloc(sizeof(SortedListPtr) * size); 
memcheck(index->arrayPtr); 
// initialize array 
int i; 
for (i = 0; i < size; i++) { 
    index->arrayPtr[i] = NULL; 
} 
return index; 

Valgrindのは、私は、このエラーを与えている:

==18735== Invalid write of size 4 
==18735== at 0x80497F1: HTCreate (chainedhash.c:35) 
==18735== by 0x8049727: main (main.c:457) 
==18735== Address 0x402e02c is 0 bytes after a block of size 4 alloc'd 
==18735== at 0x4005B83: malloc (vg_replace_malloc.c:195) 
==18735== by 0x804979B: HTCreate (chainedhash.c:32) 
==18735== by 0x8049727: main (main.c:457) 

ライン35は、mallocの声明を有するものです。それは私が割り振っていると思うので、エラーが私を混乱させるので、私はそれについて何をすべきか理解できません。どんな助けもありがとうございます。

おかげで... ポインタため

答えて

7
index = malloc(sizeof(HashTable)); 

のMallocの十分なメモリではなく、あなたの構造体。

これは、このような型を隠すtypedefが混乱を招く理由を示しています。

+0

私はまだ他の構造体のためのメモリを割り当てようとしていませんでした。コードのこの部分の私の意図は、HashTable構造体とポインタの配列のためのメモリを割り当てることでした。 – jobrien929

+0

正解です。私が上で指摘したように、あなたはそれをしていません。構造体ではないポインタのサイズである 'index = malloc(sizeof(HashTableT *))'(typedefを取り除く場合)をmallocしています。次に、あなたがmallocされたメモリの外に出てくる 'index->​​ arrayPtr'を試してみてください。この時点で、悪いことが起こります。 –

+0

ああ、今私は理解している。 'sizeof(struct HashTableT)'に変更すると、エラーがソートされました。お手伝いありがとう。 – jobrien929

関連する問題