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)?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage