Falla de segmentación pero incapaz de razonar cómo, la asignación de memoria me parece bien

Tengo un nodo y estoy definiendo su variable de puntero global de la siguiente manera:

typedef struct node
{
    char* word;
    struct node* next;
} node;

node* HashTable =  NULL;
node* HeadOfHashTable = NULL;

Ahora, asigné memoria de la siguiente manera:

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;
}

Ahora, estoy pasando un valor HASH y una palabra para poner en la tabla hash, en el siguiente método. He comentado dónde estoy obteniendo la falla seg.

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;
}

A continuación se muestran los registros de la consola:

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)

Mis dudas:

Estoy asignando 65336 bloques de memoria y el punto donde obtengo la falla seg tiene un valor hash de 36032, por lo que estoy seguro de que la variable de punteroHashTable está teniendo una dirección de memoria válida. Entonces, ¿por qué seg culpa?Si no es una dirección válida, entonces por qué no está atrapada en esta condición IFif(HashTable == NULL || HashTable == '\0' || HashTable == 0). Incluso usécalloc entonces también obtengo la falla seg y la condición IF anterior no se está capturando.Estoy teniendo una falla seg en esta líneaprintf(" Earlier value is %s, new value is %s and its pointer is %p\n", HashTable->word, ch, HashTable->next);. Esto significa algún problema al desreferenciar el puntero, entonces por qué no obtuve la falla de seg justo antes de eso, significa que debería haber tenido la falla de seg aquí solo:if(HashTable->word == NULL)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta