Как использовать LLIST * mylist [N]; - PullRequest
1 голос
/ 22 января 2010

Я получаю это:

LLIST *mylist[N];

Где N - количество строк во входном файле. Тогда mylist[i] - указатель на i-й связанный список.

Я вызываю функцию

LLIST *list_add(LLIST **p, int i){
    LLIST *n;

    n = (LLIST *) malloc(sizeof(LLIST));

    if (n == NULL)
        return NULL;

    n->next = *p; /* the previous element (*p) now becomes the "next" element */
    *p = n;       /* add new empty element to the front (head) of the list */
    n->data = i;
    return p;
}

Так что в моем основном я говорю что-то вроде

LLIST *mylist[N];
list_add(&mylist[0],1);
list_add(&mylist[0],2);
list_add(&mylist[1],3)
list_add(&mylist[1],4);
list_print(mylist[0]); // Print mylist[0]
list_print(mylist[1]); // Print mylist[1]

Моя функция Print_list:

Void *list_print(LLIST *n) {
    if (n == NULL){ 
        printf("list is empty\n");
    }

    while (n != NULL){
        printf("%d",n->data); 
        n = n->next;
    }
}

Когда я делаю list_print(mylist[0]), он печатает 2 1.

Когда я делаю list_print(mylist[1]), я получаю ошибку сегментации.

Что происходит?

Ответы [ 2 ]

1 голос
/ 22 января 2010

Вы, похоже, не инициализируете содержимое массива mylist, и оно может содержать значения, указывающие на случайные области памяти. При добавлении новых элементов это не имеет значения, новые элементы вставляются в начале, никогда не получая доступ к неверным указателям. Но когда вы пытаетесь распечатать список, функция печати будет следовать за недействительным указателем в конце списка и вызвать ошибку сегментации.

Чтобы избежать этого, добавьте инициализатор в объявление массива:

LLIST *mylist[N] = {NULL};

Это установит все элементы mylist в NULL.

0 голосов
/ 23 января 2010

Это работает LLIST * mylist [10] = {NULL}; Но если бы я хотел сделать это, я получил бы ошибки:

х = 10; LLIST * mylist [x] = {NULL};

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