2010-05-04 7 views
1
#include<stdio.h> 
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 que j'entre l'adresse IP du premier noeud, je suis confronté à une erreur de fragmentation. Le code s'est écrasé. Quelqu'un peut-il éclairer?Erreur de fragmentation lors de l'exécution du programme C

+0

Je pense que je peux deviner ce que vous entendez par une erreur de fragmentation, mais vous devriez vraiment être plus précis. Quelle est l'erreur exacte? Aussi, avez-vous utilisé un débogueur ou un outil similaire (je suggère valgrind), et qu'est-ce qu'il a dit? – crazyscot

Répondre

2

ipAddress est juste un pointeur char qui n'est pas initialisé. Vous ne l'avez pas la mémoire allouée qui pourrait être fait par ipAddress

Lorsque vous

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

Il est prévu que les points temp1-> IPADDRESS à un tableau de caractères, ce qui pourrait être allouée de manière dynamique ou statique.

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. 

également une fois que vous allouez un nouveau nœud en faisant un malloc vous n'êtes pas initialisez 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. 

également lorsque la liste est initialement vide, head seront NULL de sorte que le bloc si sera exécuté. Vous devez faire le point head au nœud nouvellement créé, qui est pointée par temp1 pas temp:

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