c89 - Поиск узла в связанном списке возвращает указатель 0x1

Я не могу понять, почему приведенный ниже код возвращает указатель 0x1. Узел запаса найден нормально, как показано в следующем выводе:

ticket_name passed comparison.
ticket_type passed comparison.
ticket_zone passed comparison.

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

tm_options.c:85: warning: assignment makes pointer from integer without a cast
tm_options.c:190: warning: assignment makes pointer from integer without a cast

Насколько мне известно, это предупреждение связано с тем, что в функции отсутствует прототип функции, а тип возвращаемого значения по умолчанию для функций без прототипов — int. Но у меня есть прототип функции в tm_utility.h

EDIT: вот pastebin моего Makefile на всякий случай, если это как-то связано с ним http://pastebin.com/UFw9B4Hd

struct stock_node * find_ticket(tm_type_ptr tm, char *, char, char *);

Ниже приведена функция, которая возвращает значение ошибки:

struct stock_node * find_ticket(tm_type * tm, char * ticketName, char ticketType, char * ticketZone) {

  struct stock_node * curr;
  BOOLEAN found = FALSE;

  curr = tm->stock->head_stock;

  while (curr != NULL && found == FALSE) {

    printf("curr: %p\n", (void *) curr);
    printf("curr->ticket_name: %s\n", curr->data->ticket_name);
    printf("curr->ticket_type: %c\n", curr->data->ticket_type);
    printf("curr->ticket_zone: %s\n", curr->data->ticket_zone);

      if (strncmp((char *)curr->data->ticket_name, ticketName, TICKET_NAME_LEN + 1) == 0) {

          printf("ticket_name passed comparison.\n");

          if ((char) curr->data->ticket_type == ticketType) {

              printf("ticket_type passed comparison.\n");

              if (strncmp((char *)curr->data->ticket_zone, ticketZone, TICKET_ZONE_LEN + 1) == 0) {

        printf("ticket_zone passed comparison\n");

        found = TRUE;
                return curr;

          }

       }

    } else {

       curr = curr->next_node;

    }

 }

 return NULL;

}

Любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать меня.

Код вызова:

struct stock_node * stockNode;
((stockNode = find_ticket(tm, ticketName, ticketType, ticketZone) != NULL))

По запросу: определение структуры stock_node:

typedef struct stock_node
{
    struct stock_data * data;
    struct stock_node * next_node; 
} stock_node;

Кроме того, tm_type_ptr:

typedef struct tm * tm_type_ptr;

person Bryce    schedule 12.11.2013    source источник
comment
Запустите программу в отладчике и пройдитесь по коду строка за строкой, чтобы увидеть, что происходит на самом деле. При этом следите за значениями всех переменных.   -  person Some programmer dude    schedule 12.11.2013
comment
Почему вы не включаете tm_utility.h, чтобы избавиться от этих предупреждений? Компилятор может сгенерировать некорректный код, когда ему нужно угадать, как вызвать функцию без прототипа.   -  person user694733    schedule 12.11.2013
comment
tm_utility.h включен в tm_utility.c, это всего лишь одна функция из tm_utility.c - иначе было бы намного больше жалоб/ошибок   -  person Bryce    schedule 12.11.2013
comment
что такое tm_type_ptr в вашем файле tm_utility.h? Разве это не должно быть tm_type *? Кроме того, можете ли вы показать нам структуру struct stock_node?   -  person Chandranshu    schedule 12.11.2013
comment
Я имел в виду, что вы должны включить tm_utility.h в файл, который вызывает find_ticket. Или вы получаете эти предупреждения от tm_utility.c? В любом случае всегда сначала исправляйте предупреждения.   -  person user694733    schedule 12.11.2013
comment
Я попробовал #include tm_utility.h в tm_utility.c, но результат не изменился.   -  person Bryce    schedule 12.11.2013
comment
Хорошо, простой вопрос: вы вызываете find_ticket в tm_utility.c или каком-то другом модуле компиляции?   -  person user694733    schedule 12.11.2013
comment
Поиск билета вызывается в tm_options.c — я добавил свой make-файл в сообщение примерно на 1/3 пути вниз, если это было проблемой.   -  person Bryce    schedule 12.11.2013
comment
Затем сделайте #include "tm_utility.h" в tm_options.c тоже.   -  person user694733    schedule 12.11.2013
comment
pastebin.com/P1pk1T95 — tm_utility.h #include tm_utility.h в tm_options.c без эффекта   -  person Bryce    schedule 12.11.2013
comment
Исправьте все оставшиеся предупреждения, а затем выполните код в отладчике, как предложил Иоахим Пилеборг.   -  person user694733    schedule 12.11.2013


Ответы (2)


У меня возникла проблема с оператором присваивания в блоке if, в котором также был оператор сравнения.

((foundPtr = find_ticket(tm, ticketName, ticketType, ticketZone) != NULL));

В отличие от

((foundPtr = find_ticket(tm, ticketName, ticketType, ticketZone)) != NULL);

Сумасшедшая ошибка. Простое решение. Спасибо за помощь ребята

person Bryce    schedule 12.11.2013

Наиболее вероятным кажется то, что вы получаете повреждение стека и фактически возвращаете значение переменной 'found', для которой установлено значение true в строке перед возвратом (которое, вероятно, определяется как '1'). Источник повреждения стека, вероятно, находится где-то еще. Я бы сказал, запустите в отладчике или в Valgrind.

person Bart M.    schedule 12.11.2013