Erreur de fragmentation lors de l’exécution du programme C

#include struct table { char *ipAddress; char *domainName; struct table *next; }; struct table *head = NULL; void add_rec(); void show_rec(); int main() { add_rec(); show_rec(); return 0; } void add_rec() { struct table * temp = head; struct table * temp1 = (struct table *)malloc(sizeof(struct table)); if(!temp1) printf("\n Unable to allocate memory \n"); printf("Enter the ip address you want \n"); scanf("%s",temp1->ipAddress); printf("\nEnter the domain name you want \n"); scanf("%s",temp1->domainName); if(!temp) { head = temp; } else { while(temp->next!=NULL) temp = temp->next; temp->next = temp1; } } void show_rec() { struct table * temp = head; if(!temp) printf("\n No entry exists \n"); while(temp!=NULL) { printf("ipAddress = %s\t domainName = %s\n",temp->ipAddress,temp->domainName); temp = temp->next; } } 

Lorsque j’exécute ce code et entre l’adresse IP du premier nœud, je suis confronté à une erreur de fragmentation. Le code s’est écrasé. Quelqu’un peut-il éclairer?

ipAddress est juste un pointeur de caractère non initialisé. Vous n’avez pas alloué de mémoire pouvant être pointée par ipAddress

Quand tu fais

 scanf("%s",temp1->ipAddress); 

Il est prévu que temp1-> ipAddress pointe vers un tableau de caractères qui pourrait être alloué de manière statique ou dynamic.

Dans votre cas, vous pouvez changer

 char *ipAddress; char *domainName; 

à

 char ipAddress[16]; // aaa.bbb.ccc.ddd char domainName[MAX_DOMAIN_LEN]; // choose max length suitably. 

De même, après avoir alloué un nouveau nœud en faisant un malloc vous malloc pas le pointeur next du nœud nouvellement créé. Vous devriez faire:

 struct table * temp1 = (struct table *)malloc(sizeof(struct table)); temp1->next = NULL; // this is missing. 

De plus, lorsque la liste est initialement vide, la head sera NULL et le bloc if sera exécuté. Vous devez faire en sorte que le nœud nouvellement créé, pointé par temp1 pas temp :

 if(!temp) { head = temp; // this should be head = temp1; }