以下代码在编译时为函数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 :(得分:4)
第一个代码段的问题是fun2()
在首次使用之前尚未定义或声明。编译器生成一个隐式函数声明,返回int
,但fun2()
的实际定义返回char**
,这是冲突类型编译器错误的原因。要更正有冲突的类型错误,您可以放置fun2()
的定义,也可以在fun2()
的定义之前放置fun()
的声明。
请注意,某些calloc()
次调用的返回值是而非被分配给任何变量。
只是提到calloc()
将所有位设置为零,这符合C99标准:
请注意,这不一定与浮点零或空指针常量的表示相同。
因此使用calloc()
到NULL
指针数组可能不正确(实际上我不知道是否会出现这种情况)。另一种方法是明确地将NULL
分配给指针数组中的每个元素。
答案 1 :(得分:0)
编译器还没有看到fun2()
的定义。你必须在fun2()前面声明这个函数:
char ** fun2();
char *** fun(){
...
或在fun()之前移动fun2():
char ** fun2(){
...
}
请注意,在两种情况下,您都没有为b
分配值,calloc()
分配的内存丢失。您应该将其修改为:
char *** b = calloc(10,sizeof(char **));