2017-01-31 15 views
-3

Мой код должен нажимать элемент StackNode в стек. Однако, когда стек заполнен, я пытаюсь заставить функцию больше не нажимать и возвращать нуль, но она не вернет нуль!Функция не может вернуть значение null в c

Stack push(Stack stk,int data) 
{ 
    struct StackNode *top = stk.top; 
    struct StackNode *node = malloc(sizeof(struct StackNode)); 
    if(node == NULL) 
    { 
    printf("Stack is full\n"); 
    return NULL; 
    } 

    node->data = data; 
    node->nextNode = top; 
    stk.top = node; 
    stk.count++; 
    return stk; 
} 

Здесь ошибка я получаю: error: returning 'void *' from a function with incompatible result type 'Stack' (aka 'struct Stack') return NULL;

Я не уверен, что это значит. Как это исправить? Что такое NULL-эквивалент стека?

+1

Что неясно в сообщении об ошибке? Является ли 'NULL' значением типа' Stack'? –

+0

Не знаю, какой нулевой эквивалент для стека – ashadeka

+1

Нет эквивалента. –

ответ

0

Проблема в том, что ваша функция должна возвращать значение, которое имеет тип Stack.

код вы предоставили не определяет тип NULL, но, так как вы не видите другую ошибку, и вы присвоив его node, я бы предположил, что тип NULL является StackNode * ... или , по крайней мере, что-то совместимое с этим.

Итак, есть ваша проблема. Вы пытаетесь вернуть что-то с типом StackNode *, когда ваша функция заявляет о возврате Stack.

Лучше всего переделать эту функцию, которая возвращает результат операции push, а не Stack.

+1

_ «Код, который вы указали, не определяет тип NULL, но поскольку вы не видите другую ошибку и назначаете ее узлу, я бы предположил, что тип NULL - это StackNode * ... или , по крайней мере, что-то совместимое с этим. "_ NULL обеспечивается реализацией и, конечно же, не будет' StackNode * '. Часто это '0', или' (void *) 0'. Это часть C и C++. –

+0

Скорее всего, да ... но 'NULL' определяется только как' (void *) 0', если вы включили заголовок, который определяет его как таковой. – Dancrumb

+0

На несколько порядков вероятность того, что полный код OP включает этот заголовок, чем OP пытается создать свой собственный «NULL» и не смог на самом деле написать указанное определение или даже упомянуть об этом. –

1

Возможно, есть некоторые основные вещи, которые вы должны переосмыслить: Во-первых, только указатели могут быть NULL, но не объекты. Следовательно, если вы возвращаете объект типа struct Stack (который не является указателем), вы не можете вернуть NULL, а просто экземпляр struct Stack.

Во-вторых, передача и возвращение объекта struct Stack по значению приведет к копированию соответствующего объекта; Я думаю, что прохождение ссылок или указателей было бы лучшим выбором; и - если вы пройдете и вернете указатель, вы также можете вернуть NULL, чтобы указать полный стек или какую-либо другую проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^