C 返回类型为二维数组
下面的代码在编译时给出了函数fun2()冲突类型的错误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
#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 **));