Printar value of a struct by pointers

Asked

Viewed 65 times

1

I want to print the "attribute" name of a "Person" type struct, but the printf returns (null) but I declare the struct name. Follow the code below:

typedef struct pessoa{
char *nome;
struct pessoa *pai;
struct pessoa *mae;
struct pessoa *filhos[4];
}Pessoa;
void imprimir_pai(Pessoa var){

printf("%s",var.pai->nome);

}

int main(void)
{
setlocale(LC_ALL,"");





Pessoa Rosa_var;
Pessoa JPaulo_var;


Pessoa Eraldo_var;
Pessoa Jeane_var;
Pessoa Erik_var;
Pessoa Jessica_var;


Pessoa Edilson_var;
Pessoa Ninho_var;
Pessoa Joana_var;
Pessoa Jan_var;


Rosa_var.nome="Rosa";
Rosa_var.pai=NULL;
Rosa_var.mae=NULL;
Rosa_var.filhos[0]=&Edilson_var;
Rosa_var.filhos[1]=&Eraldo_var;
Rosa_var.filhos[2]=&Ninho_var;
Rosa_var.filhos[3]=&Joana_var;
Rosa_var.filhos[4]=&Jan_var;

JPaulo_var.nome="José Paulo";
JPaulo_var.pai=NULL;
JPaulo_var.mae=NULL;
JPaulo_var.filhos[0]=&Edilson_var;
JPaulo_var.filhos[1]=&Eraldo_var;
JPaulo_var.filhos[2]=&Ninho_var;
JPaulo_var.filhos[3]=&Joana_var;
JPaulo_var.filhos[4]=&Jan_var;

Eraldo_var.nome = "Eraldo";
Eraldo_var.pai = &JPaulo_var;
Eraldo_var.mae = &Rosa_var;
Eraldo_var.filhos[0]=&Jessica_var;
Eraldo_var.filhos[1]=&Erik_var;
Eraldo_var.filhos[2]=NULL;
Eraldo_var.filhos[3]=NULL;
Eraldo_var.filhos[4]=NULL;

Jeane_var.nome = "Jeane";
Jeane_var.pai = NULL;
Jeane_var.mae = NULL;
Jeane_var.filhos[0]=&Jessica_var;
Jeane_var.filhos[1]=&Erik_var;
Jeane_var.filhos[2]=NULL;
Jeane_var.filhos[3]=NULL;
Jeane_var.filhos[4]=NULL;

Erik_var.nome = "Erik";
Erik_var.pai = &Eraldo_var;
Erik_var.mae= &Jeane_var;
Erik_var.filhos[0]=NULL;
Erik_var.filhos[1]=NULL;
Erik_var.filhos[2]=NULL;
Erik_var.filhos[3]=NULL;
Erik_var.filhos[4]=NULL;

Jessica_var.nome = "Jéssica";
Jessica_var.pai = &Eraldo_var;
Jessica_var.mae = &Jeane_var;
Jessica_var.filhos[0]=NULL;
Jessica_var.filhos[1]=NULL;
Jessica_var.filhos[2]=NULL;
Jessica_var.filhos[3]=NULL;
Jessica_var.filhos[4]=NULL;


imprimir_pai(Erik_var);
}

And I was also wondering if someone could explain to me how to start this array with all the null elements for everyone, to avoid code repetition, and without using malloc()

1 answer

2


The printf returns NULL because you’re doing too many assignments with your kids. Note that each person has 4 children:

typedef struct pessoa {
    ...
    struct pessoa *filhos[4];
} Pessoa;

But when you assign children, you assign 5:

...
Jeane_var.filhos[0]=&Jessica_var; //primeiro
Jeane_var.filhos[1]=&Erik_var; //segundo
Jeane_var.filhos[2]=NULL; //terceiro
Jeane_var.filhos[3]=NULL; //quarto
Jeane_var.filhos[4]=NULL; //quinto

What happens is that due to the memory position of the elements, the assignment to the 5 child overlaps part of another person who is following in memory, putting NULL(0) about some of its values and consequently destroying what was there.

One solution is to take away the extra assignment on all children:

Jeane_var.filhos[4]=NULL; //<---estas

Another involves increasing the number of children to 5.

struct pessoa *filhos[5];
//                    ^---

See how with 5 children already get the expected result

Here you see that in C you have to be a little more careful than with other languages, because the compiler will not let you know if you have to do assignments outside the limits of the array. Often, as in this case, it does not even give it an error of execution, it only presents strange results and/or behaviors.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.