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

295
Visualizações
Error de segmentación: 11 al devolver stuct a través del puntero de función en struct

Estoy tratando de emular un constructor. Estoy intentando hacer esto haciendo que una estructura principal tenga un puntero de función que devuelve un puntero a una estructura secundaria. Cualquier ayuda sería muy apreciada.

 #include <stdio.h> #include "stdlib.h" typedef struct child_t { char *name; } Child; typedef struct parent_t { Child (*NewChild)(); } Parent; Child *NewChild() { Child *child = malloc(sizeof(Child)); child->name = "foo"; return child; } int main() { Parent parent; Child child = parent.NewChild(); }
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Parece que no has inicializado parent.NewChild . Intente establecer eso en el puntero de función antes de llamarlo, así: parent.NewChild = NewChild; .

Además, ¿no te falta el * en Child *child = parent.NewChild(); ?

Anexo: Por los comentarios, también hay un error/conflicto en la declaración de Parent : Su función miembro NewChild se declara para devolver un Child , mientras que el método gratuito NewChild devuelve un Child* . Por lo tanto, declare el puntero de la función miembro como Child * (*NewChild)(); .

over 4 years ago · Santiago Trujillo Relatório

0

creo que te refieres a lo siguiente

 #include <stdio.h> #include <stdlib.h> typedef struct child_t { char *name; } Child; typedef struct parent_t { Child * ( *NewChild )( void ); } Parent; Child * NewChild( void ) { Child *child = malloc( sizeof( Child ) ); child->name = "foo"; return child; } int main( void ) { Parent parent = { NewChild }; Child *child = parent.NewChild(); puts( child->name ); free( child ); }

La salida del programa es

 foo

Es decir, debe declarar la función correctamente. Su tipo de retorno debe ser un puntero. Entonces debe declarar el puntero de función correctamente en la definición de estructura

 typedef struct parent_t { Child (*NewChild)(); ^^^^^^ } Parent;

Y necesita inicializar el objeto de tipo Padre.

 Parent parent = { NewChild };

de lo contrario, tiene un valor indeterminado.

over 4 years ago · Santiago Trujillo Relatório

0

Veo los siguientes problemas en su código.

Función no coincidente y puntero de función

En Parent , ha definido NewChild como:

 Child (*NewChild)();

Eso dice que NewChild es un puntero a una función que no toma argumentos y devuelve un objeto Child .

La función que has definido:

 Child *NewChild() { ...

No toma argumentos y devuelve un puntero a Child , no un objeto de Child .

Tendrás que decidir cuál necesita ser arreglado. Para corregir la función, haga que su retorno sea de tipo Child .

 Child NewChild() { ...

Child no inicializado del parent

Ha dejado el valor de parent.Child sin inicializar pero está tratando de usarlo.

Configuración del miembro de Child

Utiliza el siguiente código para establecer el name del child .

 child->name = "foo";

Esto puede o no ser un problema dependiendo de cómo use child->name ya que child->name apunta a algunos datos globales en la memoria de solo lectura de la computadora. Será mejor hacer una copia de "foo" .

Aquí está mi sugerencia para actualizar su código:

 Child NewChild() { Child child; // strdup is available on some platforms but it can // be implemented easily. child->name = strdup("foo"); return child; } int main() { Parent parent; parent.NewChild = NewChild; Child child = parent.NewChild(); }
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