Ошибка фрагментации при выполнении программы на C - PullRequest
1 голос
/ 04 мая 2010
#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-адрес для первого узла, я сталкиваюсь с ошибкой фрагментации. Код упал. Может кто-нибудь просветить?

1 Ответ

2 голосов
/ 04 мая 2010

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, поэтому блок if будет выполнен. Вы должны указать head на только что созданный узел, на который указывает temp1, а не temp:

if(!temp)
{
  head = temp; // this should be head = temp1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...