2014-01-30 217 views
0

我想编写一个简单的代码来构建一个C语言的树。以下是我的代码片段。C编译器问题C

#include<stdio.h> 

struct node 
{ 
    int data; 
    struct node *left; 
    struct node *right; 
}; 

int main() 
{ 
    struct node *root = newNode(5); 
    //struct node *root = NULL; working piece 
    //newNode(&root,5); working piece 
    if(root == NULL) 
    { 
    printf("No root\n"); 
    return 0; 
    } 
    //root->left = newNode(4); 
    //root->right = newNode(3); 
    //root->left->left = newNode(2); 
    //root->right->right = newNode(1); 

    return 0; 
} 

struct node* newNode(int data) 
{ 
    struct node *temp; 
    temp = (struct node*) malloc(sizeof(struct node)); 
    temp->data = data; 
    temp->left = NULL; 
    temp->right = NULL; 

    return(temp); 
} 

当我尝试返回结构节点地址,编译器给我的错误

"rightNode.c", line 29: identifier redeclared: newNode 
     current : function(int) returning pointer to struct node {int data, pointer to struct node {..} left, pointer to struct node {..} right} 
     previous: function() returning int : "rightNode.c", line 12 

但是当我评论这个struct node* newNode(int data)并试图定义通过传递的地址返回INT功能下面这个函数的结构,它不会给我带来任何错误。

int newNode(struct node **root,int data) 
{ 
    printf("Inside New Node\n"); 
    return 0; 
} 

据我所知,在C中返回结构地址到调用函数是合法的。

这与编译器有关。

我使用cc编译在UNIX环境

type cc 
cc is a tracked alias for /apps/pcfn/pkgs/studio10/SUNWspro/bin/cc 

下面是把我用来编译cc rightNode.c

任何帮助,将不胜感激命令

+0

@自我由于它不显示我的任何错误。但我的疑问是,是否有必要声明函数的原型?如果是这样,为什么而返回int它不显示任何错误 – arunb2w

+0

原型,还包括对''malloc' –

+0

@ stdlib.h' arunb2w编译器会猜测该函数返回一个int,如果它不能“发现”它。 – this

回答

1

在使用它之前,您需要声明一个newNode原型。

// somewhere after struct node definition and before first use 
struct node* newNode(int); 

您还需要包括stdlib.h得到malloc

+0

感谢它并没有显示任何错误。但我的疑问是,是否有必要声明函数的原型?如果是这样,为什么而返回int它不显示任何错误 – arunb2w

+0

@ arunb2w有一个称为一个非常古老的传统特征:'隐函数declarations'。如果您在'C99'模式下编译您的代码,则会出现错误。为你的编译器尝试像'-std = c99'或'-std = c11'这样的参数并查看。 – pmr

1

struct node* newNode(int data)上面的代码并包括stdlib.h

如果要在声明它之前使用函数,则需要函数原型。 malloc也在stdlib.h中定义。

1

当您调用struct node *root = newNode(5);时,没有函数原型可见,因此编译器感到困惑。

0

当编译器找不到函数声明时,它假定这样的函数存在,但返回int。在main中致电newNode(...)之前,申报struct node* newNode(int data);

0

在旧版本的C中,在使用它之前不需要声明函数。在较早的C中,未声明的函数被假定为返回int并接受未指定数量的参数。这是您收到错误的原因,因为编译器假定newNode函数返回int,而不是struct node *

在现代C(C99和更新版本)中,您不能再执行此操作。您必须在使用前声明函数必须。一些编译器仍然允许旧的行为并警告它,但严格符合C99的程序不能在没有首先声明的情况下使用函数。

对于您的情况,您应该在main函数之前放置以下代码行。这讲述newNode功能的编译器,它应该如何被称为:

struct node *newNode(int);