Un puntero a función en C es una variable que almacena la dirección de una función, permitiendo seleccionar dinámicamente qué función llamar. La declaración típica de un puntero a función es:
// Puntero a función que toma un int y devuelve un int int (*f_ptr)(int);
Para un arreglo de punteros:
int func1(int x) { return x + 1; } int func2(int x) { return x * 2; } int (*f_arr[2])(int) = { func1, func2 }; int result = f_arr[1](10); // devolverá 20
¿Se puede usar un puntero a función para llamar a una función con una firma diferente?
Respuesta incorrecta frecuente: «Sí, si se usa una conversión de tipo».
Respuesta correcta: Técnicamente es posible debido a la naturaleza dinámica de los punteros, pero este tipo de acción conduce a errores en tiempo de ejecución y comportamientos impredecibles, ya que se llaman funciones con diferentes convenciones de llamada y composición de argumentos.
Ejemplo:
void funcA(int x) { printf("A: %d\n", x); } void funcB(float y) { printf("B: %f\n", y); } void (*fptr)(int) = (void (*)(int)) funcB; fptr(5); // ERROR: se pasarán datos incorrectos
Historia
Historia
Historia
En el firmware no se verificaba el resultado del cambio de punteros a funciones. La insuficiente inicialización del arreglo de controladores conducía a la llamada de un puntero nulo (NULL), tras lo cual el dispositivo se colgaba sin notificar al usuario.