Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

210
Vistas
Puntero de función fundido en función con estructura C heredada

Estoy buscando una respuesta si se presenta en una función de ejemplo y la llamada es válida en C (si no es un ejemplo, sería bueno obtener un comportamiento similar).

Ejemplo:

 #include <stdio.h> #include <stdint.h> typedef struct { uint32_t a; } parent_t; typedef struct { parent_t parent; uint32_t b; } child_t; typedef void (*funct_ptr_t)(parent_t* pParent, uint32_t x); void test_function(child_t* pChild, uint32_t x); int main() { funct_ptr_t func = (funct_ptr_t)test_function; funct(NULL, 0U); return 0; } void test_function(child_t* pChild, uint32_t x) { // do something }

@EDITAR Como lo anterior resultó ser inválido, también me gustaría preguntar sobre el segundo enfoque

 typedef void (*funct_ptr_t)(void* pChild, uint32_t x); void test_function(child_t* pChild, uint32_t x); int main() { funct_ptr_t func = (funct_ptr_t)test_function; child_t child; func(&child, 0U); return 0; } void test_function(child_t* pChild, uint32_t x) { // do something }
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esto no es válido.

Una función solo se puede llamar a través de un tipo de puntero de función compatible. Para que dos tipos de punteros de función sean compatibles, los argumentos correspondientes deben tener tipos compatibles y los tipos de retorno deben ser compatibles.

test_function tiene tipo void (*)(child_t*, uint32_t ) pero se llama a través de un puntero de función con tipo void (*)(parent_t*, uint32_t ) . Esto significa que la función se llama a través de un tipo incompatible y, al hacerlo, desencadena un comportamiento indefinido .

Si está tratando de aceptar un puntero a diferentes tipos para el primer parámetro, la forma más sencilla de manejar esto es cambiar el tipo del primer parámetro tanto para la función como para el puntero de función para void * , luego realizar la conversión necesaria dentro de la función.

Otra opción es cambiar el tipo del primer parámetro a test_function a parent_t * y realizar una conversión dentro de la función. Esto funcionará porque un puntero a una estructura se puede convertir en un puntero a su primer miembro, por lo que podría hacer esto:

 void test_function(parent_t* pChild, uint32_t x); int main() { funct_ptr_t func = (funct_ptr_t)test_function; child_t c; funct((parent_t *)&c, 0U); return 0; } void test_function(parent_t* p, uint32_t x) { child_t *p_Child = (p_Child *)p; // do something }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda