C 返回类型为二维数组

C 返回类型为二维数组,c,calloc,C,Calloc,下面的代码在编译时给出了函数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]=ca

下面的代码在编译时给出了函数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();
}    
#包括
#包括
char***fun(){
字符***b;
calloc(10,sizeof(char**));
b[0]=fun2();
返回b;
}
char**fun2(){
字符**a;
a=calloc(10,sizeof(char*);
a[0]=calloc(10,sizeof(char));
返回a;
}
main(){
字符**c;
c=乐趣();
}    
然而,这段代码并没有-

#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();
}
#包括
#包括
char***fun(){
字符***b;
calloc(10,sizeof(char**));
b=fun2();
字符**a;
a=calloc(10,sizeof(char*);
a[0]=calloc(10,sizeof(char));
返回a;
}
main(){
字符**c;
c=乐趣();
}

但是,两个程序都在执行相同的任务。编译错误背后的原因是什么?

第一个代码段的问题是在第一次使用之前未定义或声明
fun2()
。编译器生成一个隐式函数声明,返回一个
int
,但是
fun2()
的实际定义返回一个
char**
,这是冲突类型编译器错误的原因。要更正冲突类型错误,可以将
fun2()
的定义或
fun2()
的声明置于
fun()的定义之前

请注意,一些
calloc()
调用的返回值没有分配给任何变量

只需提及
calloc()
将所有位设置为零,根据C99标准:

请注意,这不必与浮点零或空指针常量的表示形式相同


因此,将
calloc()
用于
NULL
指针数组可能是不正确的(实际上,我不知道是否存在这种情况)。另一种方法是显式地将
NULL
分配给指针数组中的每个元素。

第一个代码段的问题是在第一次使用之前没有定义或声明
fun2()
。编译器生成一个隐式函数声明,返回一个
int
,但是
fun2()
的实际定义返回一个
char**
,这是冲突类型编译器错误的原因。要更正冲突类型错误,可以将
fun2()
的定义或
fun2()
的声明置于
fun()的定义之前

请注意,一些
calloc()
调用的返回值没有分配给任何变量

只需提及
calloc()
将所有位设置为零,根据C99标准:

请注意,这不必与浮点零或空指针常量的表示形式相同


因此,将
calloc()
用于
NULL
指针数组可能是不正确的(实际上,我不知道是否存在这种情况)。另一种方法是显式地将
NULL
赋值给指针数组中的每个元素。

编译器还没有看到
fun2()
的定义。必须在fun2()前面声明函数:

或者在fun()之前移动fun2():

请注意,在这两种情况下,您都没有为
b
赋值,并且
calloc()
分配的内存丢失。您应该将其修改为:

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

编译器尚未看到
fun2()
的定义。必须在fun2()前面声明函数:

或者在fun()之前移动fun2():

请注意,在这两种情况下,您都没有为
b
赋值,并且
calloc()
分配的内存丢失。您应该将其修改为:

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

第二个片段完成了吗?我没有看到
fun2()
的定义。第二个片段在fun()的前两行中泄漏内存。第二个片段完成了吗?我看不到
fun2()
的定义。第二个定义在fun()的前两行中泄漏内存。我同意前者-在模块头中声明所有函数的原型没有开销,但它清楚地说明了您定义的内容。在主要中,在这一点上,
c
被声明为
char**
但是
fun
被声明为返回
char***
,编译器也应该对此发出警告。我同意前者-在模块头中声明所有函数的原型时没有开销,但它清楚地说明了您定义的内容。主要是,
c
被声明为
char**
但是
fun
被声明为返回
char***
,编译器也应该对此发出警告。
char *** b = calloc(10,sizeof(char **));