返回指针时出错

时间:2013-09-13 03:18:13

标签: c

我正在练习用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,这就是它所说的

2 个答案:

答案 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>,这对某些编译器有帮助。