ProgramaciónProgramador de sistemas

Describa las características de la declaración y el uso de punteros a funciones en C. ¿Cómo almacenar correctamente un arreglo de punteros a diferentes funciones y llamarlas dinámicamente?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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
  • Este enfoque permite crear tablas de comandos, controladores o vincular automáticamente acciones con el número de operación.
  • Todas las funciones deben tener la misma firma.
  • Al trabajar con punteros a funciones, los tipos deben coincidir exactamente.

Pregunta trampa

¿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

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia

En un proyecto de sistema de plugins, se colocaron en la tabla de punteros funciones con diferentes firmas (una devolvía int, la otra void). Al ejecutarse en algunas arquitecturas, se producía una corrupción de la pila.

Historia

En un antiguo sistema de gestión de comandos se utilizaba un arreglo de punteros a funciones. Un novato agregó una función con parámetros adicionales, lo que provocó una ejecución impredecible al saltar al nuevo elemento del arreglo.

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.