2011-11-13 1 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

정확하고 위에서 지적한대로, 당신은 그렇게하지 않습니다. struct가 아닌 포인터의 크기 인 malloc'ing'index = malloc (sizeof (HashTableT *))'(typedef를 제거하면). 그런 다음 malloc 된 메모리 외부에있는'index-> ​​arrayPtr'을 시도해보십시오. 이 시점에서 나쁜 일이 일어납니다. –

+0

아, 이제 알겠습니다. 'sizeof (struct HashTableT)'로 변경하면 오류가 정렬됩니다. 도와 주셔서 감사합니다. – jobrien929