La misma salida se muestra todo el tiempo en la estructura. ¿Cómo puedo solucionarlo?

A continuación se muestra el código de un ejemplo de estructura. Cuando agrego información múltiple para diferentes personas todo el tiempo, muestra el mismo resultado que la última información insertada. ¿Cómo puedo arreglarlo?

#include<stdio.h>
#include<string.h>

struct Person{

       char *name;
       char *adress;

}p[100];

void insert(int ind , char *name, char *adress){

      p[ind].name = name;
      p[ind].adress = adress;
}

void display(int n){`enter code here`

   for(int i =0 ; i<n ; ++i){
     printf("%s %s\n" , p[i].name , p[i].adress);
   }
}


int main(){
char name[100] , address[100];

    for(int i = 0 ; i<2 ; ++i){

         fflush(stdin);
         gets(name);
         fflush(stdin);
         gets(address);
         insert(i , name , address);
    }


   display(2);


  return 0;
}
Answer

Para almacenar y generar toda la información, debe proporcionarles una memoria separada.
El código que se muestra siempre sobrescribe el mismo búfer y almacena solo punteros a ese búfer.
Un pequeño cambio en la definición de su estructura asegura que se proporcione memoria en lugar de solo almacenar un puntero (para siempre la misma memoria).

Luego, lea en la memoria individual, que también guarda la copia necesaria de cadenas de tipo C, que es tediosa.

El siguiente código muestra toda la información utilizando los conceptos descritos:

#include<stdio.h>
#include<string.h>

struct Person{

       char name[100];
       char adress[100];

}p[100];

void display(int n){

   for(int i =0 ; i<n ; ++i){
     printf("%s %s\n" , p[i].name , p[i].adress);
   }
}


int main(){

    for(int i = 0 ; i<2 ; ++i){

         // fflush(stdin); Not using this is a habit you should adopt.
         // gets(name); Not using this is a habit you should adopt.
         fgets(p[i].name, 99, stdin);
         // fflush(stdin); Not using this is a habit you should adopt.
         fgets(p[i].adress, 99, stdin);
    }


   display(2);


  return 0;
}

Para una entrada de, por ejemplo:

name1
address1
name2
address2
a
b
c
d
e
f
g
h

(con entrada adicional intencional después de la esperada, para mostrar un final limpio)

El resultado es el que solicitó, con información diferente en lugar de siempre la misma.

name1
 address1

name2
 address2

Es posible que desee reemplazar la nueva línea que se lee junto con la entrada.