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에 문 하나입니다. 나에게 쓰기 때문에 쓰는 것이 아니라 할당하는 것 같다. 그래서 그 오류는 나를 혼란스럽게 만들고 나는 그것에 대해 무엇을해야 할지를 알 수 없다. 어떤 도움을 주셔서 감사합니다.
감사합니다 ... 포인터에 대한
아직 다른 구조체에 메모리를 할당하려고 시도하지 않았습니다. 코드의이 부분에 대한 의도는 HashTable 구조체와 포인터 배열에 메모리를 할당하는 것이 었습니다. – jobrien929
정확하고 위에서 지적한대로, 당신은 그렇게하지 않습니다. struct가 아닌 포인터의 크기 인 malloc'ing'index = malloc (sizeof (HashTableT *))'(typedef를 제거하면). 그런 다음 malloc 된 메모리 외부에있는'index-> arrayPtr'을 시도해보십시오. 이 시점에서 나쁜 일이 일어납니다. –
아, 이제 알겠습니다. 'sizeof (struct HashTableT)'로 변경하면 오류가 정렬됩니다. 도와 주셔서 감사합니다. – jobrien929