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();
}

ただし、両方のプログラムが同じタスクを実行しています。コンパイルエラーの背後にある理由は何ですか?

4

2 に答える 2

4

最初のコード スニペットの問題は、fun2()最初に使用する前に定義または宣言されていないことです。コンパイラは、 を返す暗黙的な関数宣言を生成しますがint、 の実際の定義fun2()は a を返しますchar**。これが、競合する型のコンパイラ エラーの原因です。型の競合エラーを修正するには、 の定義を配置するか、 の定義の前に のfun2()宣言を配置します。fun2()fun()

calloc()一部の呼び出しの戻り値は、どの変数にも割り当てられていないことに注意してください。

calloc()C99標準によると、すべてのビットをゼロに設定することに言及してください。

これは、浮動小数点ゼロまたはヌル ポインター定数の表現と同じである必要はないことに注意してください。

したがって、ポインター配列calloc()への使用は正しくない可能性があります (実際には、これが当てはまるかどうかはわかりません)。別の方法は、ポインター配列の各要素に明示的に割り当てることです。NULLNULL

于 2012-11-06T09:27:08.207 に答える
0

コンパイラは の定義をfun2()まだ見ていません。fun2() の前で関数を宣言する必要があります。

char ** fun2();

char ***  fun(){
...

または fun2() を fun() の前に移動します。

char ** fun2(){
...
}

bどちらの場合も値を割り当てておらず、によって割り当てられたメモリcalloc()が失われることに注意してください。これを次のように変更する必要があります。

char *** b = calloc(10,sizeof(char **));
于 2012-11-06T09:30:11.927 に答える