c qsort string array

qsort(words, size1, size2, compareWords); 

en el interior compara palabras:

  int compareWords(const void *ac, const void *bc) 

esto funciona:

  char const *a = *(const char **)ac; 

estos no ( a obtiene algunos valores de basura):

  char const *a = ac; char const *a = (const char *) ac; 

¿Cuál es la razón?

Además, en algunos ejemplos, veo size2 como sizeof(char *) . ¿No debería esto ser sizeof(*words) ?

las palabras se declaran como: char *words[] = {"abc", "pqr", "abcd", "pqsl"};

Cuando se qsort una matriz de T, su función de comparación debe convertir sus punteros const void* en const T* , porque T no puede tomarse por valor.

Si las words son una matriz de char* o char const * , tiene que convertir los argumentos a char* const * o char const * const * respectivamente, es natural cuando se dice de esta manera.