#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; }