Обновление LinkedList не удается c программированием - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь реализовать простой LinkedList в C, используя две структуры. Затем моя цель - распечатать данные, которые хранятся в заголовке связного списка.

Мой код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LineParser.h"
#include <limits.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define SYS_OPEN  5
#define SYS_CLOSE 6
#define SYS_READ  3
#define SYS_WRITE 4
#define SYS_lseek 19

#define STDOUT 1
#define STDIN  0
#define STDERR 2

char buf[2048];

typedef struct pair {
    char *name;
    char *value;
} pair;

typedef struct pList {
    pair *curPair;
    struct pList *next;
} pList;

pList *head;

void addLink(pList *link);

void addLink(pList *link) {
    if (head == NULL) { //head empty
        head = link;
    } else {
        pList *curLink = head;
        while (curLink->next != NULL) {
            curLink = curLink->next;
        }
        curLink->next = link;
    }
}

void print() {
    printf("%s", head->curPair->name);
}

void dummyFunc() {
    pair *p = (pair *)malloc(sizeof(pair));
    p->name = "User1";
    p->value = "123";
    pList *link = (pList *)malloc(sizeof(pList));
    link->curPair = p;
    link->next = NULL;
    addLink(link);
    head = (pList *)malloc(sizeof(pList));
    head->curPair = p;
    head->next = NULL;
    print();
}

int main(int argc, char *argv[]) {
    char argVals[3];
    argVals[2] = '\0';
    //init the list
    head = NULL;

    while (1 == 1) {
        fgets(buf, 2048, stdin);
        if (strcmp(buf, "dummy") == 0) {
            dummyFunc();
        }
    }
}

Затем, когда выполняется функция print (вызывается из dummyFunc), программа получает ошибку сегмента, подразумевая, что изменения, произошедшие в dummyFunc, фактически не влияли на head.

1 Ответ

1 голос
/ 07 мая 2019

Есть то, что вы не говорите использовать, потому что весьма маловероятно, что if (strcmp(buf, "dummy") == 0) соответствует.Вам нужно было бы ввести ровно dummy без завершающего символа новой строки для сравнения, чтобы вернуть 0 и для вызова dummyFunc()!

Кроме того, почему вы перезаписываете head с новым выделенным узлом вместо вызова addLink, как вы только что сделали?Это приводит к утечке памяти, но нет ошибки сегментации, если только malloc() не настроен на ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...