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

2 回答 2

4

该代码gcc在 c90 和 c99 模式下编译和运行都很好,所以你可以做几件事。

首先,您应该向我们展示实际错误(应该与原始问题一起出现)。

其次,获取文件的十六进制转储,以确保其中没有有趣的字符,例如使用 command od -xcb myprog.c

第三,从指定非 void 返回类型的函数返回值也是一个好习惯。C 的后期迭代使这变得不必要,main但早期的迭代可能会导致随机值被传递回环境。即使我不再需要,我仍然返回零main(很难打破 30 年的习惯)。

最后一点可能就是这里发生的事情,具体取决于您使用的编译器和版本。如果没有明确的 return from main,ideaone 的编译器会给出一个不是很有帮助的消息:

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

当您输入退货时,它开始工作:

Success time: 0 memory: 2376 signal:0

NetBeans 的编译器是否存在同样的问题,我无法评论,但值得一试。

注意到,编译这段代码gcc --std=c99然后运行它,返回代码为 0(带echo $?)。但是,编译它gcc --std=c90会给出8运行时的返回码。所以这是最可能的原因,NetBeans 在程序完成后解释退出代码。

顺便说一句,您不应该从mallocC 中转换返回值。它可以隐藏一些细微的错误,例如,如果它的范围内没有原型并且您的整数和指针的宽度不兼容。

于 2013-09-13T03:26:04.190 回答
0

尝试使用#include<malloc.h>,这对某些编译器有帮助。

于 2013-09-13T07:54:14.973 回答