我正在练习用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,这就是它所说的
答案 0 :(得分:4)
在c90和c99模式下,该代码在gcc
中编译并运行得很好,所以你可以做几件事。
首先,您应该向我们显示实际错误(原始问题应该出现)。
其次,获取文件的十六进制转储以确保其中没有有趣的字符,例如使用命令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是否与其编译器存在同样的问题我无法发表评论,但值得一试。
我将注意,使用gcc --std=c99
编译此代码然后运行它,返回代码为0(带echo $?
)。但是,使用gcc --std=c90
进行编译会在运行时返回8
的返回码。因此,这是最可能的原因,NetBeans在程序完成后解释退出代码。
顺便说一句,你不应该从C中
malloc
转换返回值。它可以隐藏一些细微的错误,例如,在它的范围内没有原型,你的整数和指针不兼容宽度。
答案 1 :(得分:0)
尝试使用#include<malloc.h>
,这对某些编译器有帮助。