Единственный список ссылок в C - PullRequest
0 голосов
/ 30 июня 2011

Это мой первый пост на StackOverFlow. Я работал над списком ссылок - ниже мой код. Я просто добавляю один узел в список и печатаю его - все, что я делаю, это передаю указатель на функцию «addTermNode» и затем указываю этот переданный указатель на вновь созданный узел.

#include<stdio.h>
#include<time.h>


typedef struct _termination_code_ {
  int terminationCode;
  unsigned long time;
  struct _termination_code_ *next;
}termination_code;

int addTermCode(termination_code *infoTerm, int termCode, unsigned long timerInfo)
{
        termination_code *node;
        node=(termination_code*)malloc(sizeof(termination_code));
        if(NULL == node) return -1;
        node->terminationCode=termCode;
        node->time=timerInfo; 
        node->next=NULL;
        infoTerm = node;
        return 0;
}

int main ()
{
        termination_code *list2=NULL;
        //Add A single node and print it. 
        if(addTermCode(list2, 12, time(0))==0)
                printf("All OK node added\n");
        else 
                printf("something went wrong\n");

        printf("Entered info :%d %ld\n",list2->terminationCode,list2->time);
}

Вот что я получаю на выходе - Не знаю почему. Пожалуйста, помогите.

[zahmed@build3 rnd]$ ./a.out 
All OK node added
Segmentation fault
[zahmed@build3 rnd]$ 

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

В addTermCode вы меняете значение переменной infoTerm.Это значение является указателем, но вы изменяете только локальное значение (C - только передача по значению).Чтобы изменить указатель вне функции, вы должны передать указатель на указатель ... Что-то вроде termination_code ** infoTerm и изменить * infoTerm = & node.

И, чтобы быть понятным, ошибка сегментациипотому что вы обращаетесь к внешнему указателю, который не был изменен и все еще указывает на неправильный адрес.

0 голосов
/ 30 июня 2011

Проблема в том, как вы передаете обратно новый объект. Присвоение нового объекта указателю не будет работать так, как вы его написали. Вместо этого вы должны вернуть объект из функции addTermCode ().

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

Если нет, вам нужно настроить код так, чтобы указатель был правильно назначен.

int addTermCode(termination_code **infoTerm, int termCode, unsigned long timerInfo)
{
     ....
     *infoTerm = node;
}

int main ()
{
    termination_code *list2=NULL;
    //Add A single node and print it.
    if(addTermCode(&list2, 12, time(0))==0)
       printf("All OK node added\n");
    printf("Entered info :%d %ld\n",list2->terminationCode,list2->time);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...