2010-05-04 3 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; 
    } 
} 

Когда я выполняю этот код и вводя IP-адрес для первого узла, я сталкиваюсь с ошибкой фрагментации. Код разбился. Может кто-нибудь просветить?Ошибка фрагментации при выполнении программы на C

+0

Я думаю, что я могу предположить, что вы имеете в виду ошибки фрагментации, но вы действительно должны быть более конкретными. Какая именно ошибка? Кроме того, вы использовали отладчик или аналогичный инструмент (я предлагаю valgrind) и что он сказал? – crazyscot

ответ

2

ipAddress - всего лишь указатель на символ, который неинициализирован. Вы не выделенную память, которая может быть направлен на ipAddress

Когда вы

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

Ожидается, что temp1-> Точки Ipaddress в массив символов, который может быть статически или динамически.

В вашем случае вы можете изменить

char *ipAddress; 
char *domainName; 

в

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

Также после выделения нового узла, выполнив malloc вы не инициализации next указателя вновь созданного узла. Вы должны делать:

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

Кроме того, если список изначально пуст, head будет NULL поэтому, если блок будет выполнен. Вы должны сделать head точку на вновь созданный узел, на который указывает на temp1 не temp:

if(!temp) 
{ 
    head = temp; // this should be head = temp1; 
} 
Смежные вопросы