Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

211
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda