2013-09-13 5 views
0

Я занимаюсь кодированием двоичного дерева поиска в C, и я столкнулся с ошибкой.Ошибка при возврате указателя

#include <stdio.h> 
#include <stdlib.h> 

/*struct Node*/ 
typedef struct Node{ 
    int data; 
    struct Node* left; 
    struct Node* right; 
}Node; 

/*Forward declaration*/ 
Node *createNode(int data); 

int main(int argc, char** argv) { 
    Node *root; 
    root = createNode(3); //ERROR 

} 

Node* createNode(int data){ 
    Node* newNode = (Node*)malloc(sizeof(Node)); 

    if(newNode==NULL){ 
     fprintf(stderr,"Failed to allocate node\n"); 
     exit(1); 
    } 

    newNode->data = data; 
    newNode->left = NULL; 
    newNode->right= NULL; 
    return newNode; //ERROR OCCURS HERE 

} 

Я получаю неудачный прогон, когда я пытаюсь запустить это. Ошибка возникает при возврате newNode. Я не уверен, почему точка не возвращается.

Я использую NetBeans, и это то, что он говорит

+4

Не ваша ошибка, но нет необходимости бросать результат 'malloc'. – detly

+1

Вам нужно предоставить больше информации, чем «ошибка возникает во время возвращения newNode». Какая ошибка? Это сообщение об ошибке «fprintf» есть или что-то еще? Это действительно ошибка или просто неожиданный результат? и т.д. Покажите нам, что произойдет, когда вы запустите свой код. – detly

+0

Код выглядит хорошо, поэтому нам нужно знать, какую ошибку вы видите. Одна вещь, которую я заметил, это то, что у вас нет оператора 'return' в конце вашей функции' main', но я не думаю, что обычно это вызывает проблемы для большинства компиляторов. –

ответ

4

Этот код компилируется и работает нормально в gcc в обоих C90 и C99 режиме, так что есть несколько вещей, которые вы можете сделать.

Прежде всего, вы должны показать нам актуальную ошибку (что должно было прийти с оригинальным вопросом).

Во-вторых, получите шестнадцатеричный дамп файла, чтобы убедиться, что в нем нет забавных символов, например, с помощью команды od -xcb myprog.c.

В-третьих, также хорошей практикой является возврат значений из функций, в которых вы указываете тип возврата, не являющийся void. Позже итерации C делают это ненужным для main, но более ранние итерации могут привести к случайным значениям, возвращаемым в среду. Я все еще возвращаю ноль от main, хотя мне больше не нужно (трудно сломать тридцатилетнюю привычку).

Эта последняя точка может быть тем, что происходит здесь, в зависимости от того, какой компилятор и версия вы используете. Без явного возврата из main, компилятор на ideaone дает не очень полезное сообщение:

Runtime error time: 0 memory: 2376 signal:-1 

Когда вы кладете в свою очередь, он начинает работать:

Success time: 0 memory: 2376 signal:0 

ли NetBeans имеет такую ​​же проблему с его компилятор я не могу комментировать, но это стоит проверить.

I будет отметить, что составление этого кода gcc --std=c99, а затем запустить его, дает код возврата 0 (с echo $?). Однако, компиляция с gcc --std=c90 дает код возврата 8 при запуске. Так что это наиболее вероятная причина, что NetBeans интерпретирует код выхода после завершения программы.

Как и в стороне, вы не должны отбрасывать возвращаемое значение из malloc в C. Он может скрыть некоторые незначительные ошибки, если, например, нет прототипа в рамках для него и ваших целых и указателей не совместимы ширины ,

0

Попытайтесь использовать #include<malloc.h>, это помогает в некоторых компиляторах.

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