2012-11-06 115 views
1

下面的一段代碼在編譯時爲函數fun2()的衝突類型提供了一個錯誤。作爲二維數組返回類型

#include<stdio.h> 
#include<stdlib.h> 

char *** fun(){ 
    char *** b; 
    calloc(10,sizeof(char **)); 
    b[0]=fun2(); 
    return b; 
} 

char ** fun2(){ 
    char **a; 
    a=calloc(10,sizeof(char*)); 
    a[0]=calloc(10,sizeof(char)); 
    return a; 
} 
main(){ 
    char **c; 
    c=fun(); 
}  

然而,這段代碼不 -

#include<stdio.h> 
#include<stdlib.h> 

char *** fun(){ 
    char *** b; 
    calloc(10,sizeof(char **)); 
    b=fun2(); 
    char **a; 
    a=calloc(10,sizeof(char*)); 
    a[0]=calloc(10,sizeof(char)); 
    return a; 
} 

main(){ 
    char **c; 
    c=fun(); 
} 

但是,這兩個節目都在做同樣的工作。編譯錯誤背後的原因是什麼?

+0

第二個代碼段是否已完成?我沒有看到'fun2()'的定義。 – hmjd

+0

第二個漏洞的前兩行fun()中的內存。 – WhozCraig

回答

4

第一個代碼片段的問題是fun2()尚未在第一次使用之前定義或聲明。編譯器生成一個隱式函數聲明,返回int,但fun2()的實際定義返回char**,這是導致衝突類型編譯器錯誤的原因。要更正衝突類型錯誤,您可以將fun2()的定義放在fun()的定義之前,並將fun2()的聲明置於之前。

請注意,一些calloc()調用的返回值是而不是被分配給任何變量。

剛提及的是calloc()集的所有位零,這根據C99標準:

注意這不必是相同的浮點零的表示或一個空指針常數。

所以使用calloc()NULL的指針數組可以是不正確的(在實踐中,我不知道這是有史以來的情況下)。另一種方法是將NULL明確分配給指針數組中的每個元素。

+0

我會和前者一起工作 - 在模塊頭文件中爲所有函數聲明原型沒有任何開銷,但它清楚地說明了你正在定義的內容。 – Andrew

+0

在此基礎上,主要將'c'聲明爲'char **',但將'fun'聲明爲返回'char ***',編譯器還應警告有關內容。 – Eregrith

0

編譯器還沒有看到fun2()的定義呢。您必須聲明函數在FUN2()的前面:

char ** fun2(); 

char *** fun(){ 
... 

或移動之前樂趣FUN2()():你有沒有在分配一個值b

char ** fun2(){ 
... 
} 

注意calloc()這兩種情況和分配的內存丟失。您應該將其修改爲:

char *** b = calloc(10,sizeof(char **));