Supongamos que tengo una matriz de punteros a char en C:Cómo ordenar una matriz de punteros a char en C?
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
y quiero resolver esto matriz mediante qsort:
qsort(data, 5, sizeof(char *), compare_function);
Soy incapaz de llegar a la función de comparación. Por alguna razón esto no funciona:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
Hice un montón de búsqueda y se encontró que tenía que utilizar **
interior de qsort:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
Y esto funciona.
¿Alguien puede explicar el uso de *(const char **)name1
en esta función? No lo entiendo en absoluto. ¿Por qué el doble puntero? ¿Por qué no funcionó mi función original?
Gracias, Boda Cydo.
'data' debe declararse' const'. –
Billy, si es const, ¿todavía se puede ordenar? – bodacydo
Sí. La matriz puede ser no 'const', pero los punteros contenidos dentro de esa matriz deben ser' const'. No está permitido modificar literales constantes en tiempo de compilación como ese (es un comportamiento indefinido para hacerlo). Para obtener eso, quieres 'const char * data [5]'. Si quieres que la matriz también sea constante, harías 'const char * const data [5]'. –