Olá, sou iniciante na linguagem C e comeceia   usar ponteiros recentemente.   Poderiam me ajudar com os eguinte código, no momento em que chama o metodo faz() para imprimir o codigo de uma struct que está pontada por um ponteiro está imprimindo um valor incorreto. Mas é impresso correto se eu imprimir no método main().   Estou quebrando a cabeça para descobrir o porque disso:      #include <stdio.h> #include <stdlib.h>     int verifica(int codigo); void incluir(); void faz();      struct livro *ptPrimeiro; struct livro *ptUltimo;  #define TAM 10; int numEl = 0;      struct info{    char val[100]; };  struct livro{      //indices = 0-codigo 1-titulo 2-autor 3-editora 4-cidade     int codigo;     struct info inf[5];     struct livro *ptAntLivro;     struct livro *ptProxLivro;  };        int main() {       int opcao = 0;     while(1){      printf("\n1- Cadastrar um livro\n2- Remove livro\n3- Lista livros");     printf("\nDigite sua opcao: ");          scanf("%d", &opcao);         switch(opcao){      case 1:         incluir();         break;      case 2:         break;      case 3:     faz();          }             //AQUI FUNCIONA, IMPRIME CORRETO O VALOR            printf("\nsegundo testeFIM: %d", (*ptUltimo).codigo);    } }    void incluir(){     int codigo = 0;     printf("\nDigite o codigo do livro que sera inserido: ");     scanf("%d", &codigo);      //verifica se já há um cadastro de livro com este codigo, chamando o metodo verifica e passado o codigo como parametro     if(verifica(codigo) == 1){         printf("\nCódigo já existe!");     }     else{          struct livro novoLivro; //cria um novo registro       novoLivro.codigo = codigo;           printf("\n%d", novoLivro.codigo);       struct info iTitulo;       struct info iAutor;       struct info iEditora;       struct info iCidade;       fflush(stdin);        char teste[10];        printf("\nDigite o Titulo do livro: ");       //gets(iTitulo.val);       gets(teste);       fflush(stdin); //serve para limpar o buffer de leitura        novoLivro.inf[0] = iTitulo; //guarda titulo no indice 1        printf("\nDigite o nome do autor: ");       gets(iAutor.val);       novoLivro.inf[1] = iAutor; //guarda autor no indice 2        printf("\nDigite o nome da editora: ");       gets(iEditora.val);       novoLivro.inf[2] = iEditora; //guarda editora no indice 3        printf("\nDigite a cidade: ");       gets(iCidade.val);       novoLivro.inf[3] = iCidade; //guarda cidade no indice 4        if(numEl == 0){          ptPrimeiro = (struct livro*) malloc(sizeof(struct livro));          ptPrimeiro = &novoLivro;           ptUltimo = (struct livro*) malloc(sizeof(struct livro));          ptUltimo = &novoLivro;                  printf("\nsegundo teste: %d", (*ptUltimo).codigo);            numEl++;       }       else{           novoLivro.ptAntLivro = &ptUltimo;          //struct livro **pt;          //pt = &ptUltimo.ptProxLivro;         // struct livro tmp = *ptUltimo;//melhorar isso         // tmp.ptProxLivro =  &novoLivro;          (*ptUltimo).ptProxLivro = &novoLivro;          novoLivro.ptProxLivro = NULL;             printf("\nprimeiro teste: %d", novoLivro.codigo);          ptUltimo = (struct livro*) malloc(sizeof(novoLivro));          ptUltimo = &novoLivro;          printf("\nsegundo teste: %d", (*ptUltimo).codigo);             numEl++;       }        printf("\nLivro cadastrado com sucesso!");      }    }      int verifica(int codigo){     int i;     struct livro *tmp  = ptPrimeiro;     for(i = 1; i  <= numEl; i++){         if(codigo == (*tmp).codigo){            return 1;         }         else{            tmp = (*tmp).ptProxLivro;         }     }     return 0; }    void faz(){  int a = (*ptUltimo).codigo; printf("\nsegundo teste: %d", a);  }