2014-01-30 159 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);