Principle value of a struct through pointers

1

I want to print the "attribute" name of a struct of type "Person", however the printf returns (null) but I declare the name of the struct. Here is 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);
}

I also wanted to know if someone can explain to me how to start this array with all null elements for everyone, to avoid code repetition, and without using malloc ()

    
asked by anonymous 19.05.2018 / 04:46

1 answer

2

printf returns NULL because it is making more assignments to children. Note that each person has 4 children:

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

But when you assign the children, you are assigning 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 because of the memory position of the elements, the assignment to 5 child overlays part of another person that is next in memory, putting NULL (0) on some of its values and consequently destroying what was there.

One solution is to remove the over all assignment from all children:

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

Another is to increase 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 tell you if you have to make assignments outside the bounds of the array. Many times, just like in this one, it does not even give you an execution error, it just shows strange results and / or behavior.

    
19.05.2018 / 12:33