Segmentierungsfehler, kann aber nicht nachvollziehen, wie, die Speicherzuordnung erscheint mir in Ordnung.
Ich habe einen Knoten und definiere seine globale Zeigervariable wie folgt:
typedef struct node
{
char* word;
struct node* next;
} node;
node* HashTable = NULL;
node* HeadOfHashTable = NULL;
Jetzt habe ich den folgenden Speicher zugewiesen:
void allocateMemory(int numOfElements, bool isRealloc, const char* word)
{
if(!isRealloc)
{
printf("Allocating %d blocks\n", numOfElements);
HashTable = malloc(sizeof(node*) * numOfElements);
} else {
printf("Reallocating %d blocks for %s", numOfElements, word);
HashTable = realloc(HashTable, sizeof(node*) * numOfElements);
}
if(HashTable == NULL)
{
printf("### Out Of Memory ###\n");
exit(0);
}
HeadOfHashTable = HashTable;
}
Now, ich übergebe einen HASH-Wert und ein Wort, um die Hash-Tabelle in die folgende Methode einzufügen. Ich habe kommentiert, wo ich Seg-Fehler bekomme.
void putInHashTable(char* ch, unsigned int hashValue)
{
HashTable += hashValue;
printf("Processing at address: %p and has value was %d\n", HashTable, hashValue);
if(HashTable == NULL || HashTable == '\0' || HashTable == 0)
{
printf("Hash table is NULL");
}
if(HashTable->word == NULL)
{
HashTable->word = malloc(sizeof(char) * (LENGTH + 1));
strcpy(HashTable->word, ch);
printf("New word: %s\n", HashTable->word);
} else {
printf("### Collision detected ###\n"); // ***** BELOW LINE GIVES SEG FAULT ******
printf(" Earlier value is %s, new value is %s and its pointer is %p\n", HashTable->word, ch, HashTable->next);
putInLinkedList(ch);
}
HashTable = HeadOfHashTable;
}
Below ist Konsolenprotokolle:
Allocating 65336 blocks
Processing at address: 0xb7568c28 and has value was 388
New word: a
Processing at address: 0xb756b9a0 and has value was 1843
New word: aaa
Processing at address: 0xb7570c08 and has value was 4480
New word: aaas
Processing at address: 0xb75ae608 and has value was 36032
### Collision detected ###
Segmentation fault (core dumped)
Meine Zweifel
Ich reserviere 65336 Speicherblöcke und der Punkt, an dem ich einen Seg-Fehler erhalte, hat einen Hash-Wert von 36032, daher bin ich sicher, dass die ZeigervariableHashTable
hat eine gültige Speicheradresse. Warum dann seg Fehler?Wenn es keine gültige Adresse ist, warum wird es in dieser IF-Bedingung nicht abgefangenif(HashTable == NULL || HashTable == '\0' || HashTable == 0)
. Ich habe sogar @ verwendcalloc
dann bekomme ich auch seg fehler und über IF zustand nicht fangen.Ich erhalte Seg Fehler in dieser Zeileprintf(" Earlier value is %s, new value is %s and its pointer is %p\n", HashTable->word, ch, HashTable->next);
. Dies bedeutet ein Problem beim De-Referenzieren des Zeigers. Warum habe ich kurz zuvor keinen Seg-Fehler erhalten? Hätte ich nur hier einen Seg-Fehler haben sollen.if(HashTable->word == NULL)
?