Получение ошибки сегментации при выделении связанного списка и присвоении ему значений в c - PullRequest
1 голос
/ 14 апреля 2020

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

 typedef struct floatList{float fval;struct floatList * fnext;}node_f;


 node_f* FL_firstInts(int n){

        node_f *res=(node_f*)malloc(sizeof(node_f));
        res=res->fnext;

        for(int i=1;i<=n;i++){
            res->fval=i;
            res=res->fnext;
        }
        return res;
    }

void FL_show(struct floatList *list, char *label){
    int i=0;
    while(list->fnext!=NULL){
        printf("%d: %f\n",i,f->fval);           
        list=list->fnext;
        i++;
    }
}

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

node_f *ten = FL_firstInts(10);
FL_show(ten,"10 first integers");

Но когда я запускаю программу, я получаю ошибку сегментации, как мне ее исправить?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

В функции FL_firstInts вы выделили неинициализированный объект типа node_f

node_f *res=(node_f*)malloc(sizeof(node_f));

Так что следующий оператор

res=res->fnext;

уже вызывает неопределенное поведение.

Функция может быть определена, по крайней мере, следующим образом:

node_f * FL_firstInts( int n )
{
    node_f *head = NULL;
    node_f **current = &head;
`
    for ( int i = 0; i < n; i++ )
    {
        *current = malloc( sizeof( node_f ) );

        ( *current )->fval  = i;
        ( *current )->fnext = NULL;

        current = &( *current )->fnext;
    }

    return head;
}

Th функция FL_show имеет ту же ошибку и, кроме того, параметр label не используется.

Функция может быть определена как

void FL_show( const node_f *head, const char *label )
{
    if ( label ) puts( label );

    for ( int i = 0; list != NULL; list = list->fnext )
    {
        printf( "%d: %f\n", i, f->fval );           
        i++;
    }
}
1 голос
/ 14 апреля 2020
node_f *res=(node_f*)malloc(sizeof(node_f));
res=res->fnext;

Причина вашего cra sh заключается в том, что вы никогда не инициализируете указатель res->fnext.
Поэтому, прежде чем получить к нему доступ, установите его в качестве фактического следующего элемента в вашем списке.

В целом ваш код немного нечеткий.
Вы выделяете память для one node_f, но на самом деле вы пытаетесь вставить в нее n элементы.

Чтобы выделить память для элементов n, просто умножьте размер одного элемента на n.

node_f *res= (node_f*) malloc(sizeof(node_f) * n);

После этого инициализируйте указатели fnext.

for(size_t index{0}; index < n - 1; index++)
  res[index].fnext = &res[index + 1];
res[n - 1].fnext = nullptr;
...