下面的代码给出了编译时函数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();
}

但是,两个程序都在做同样的任务。编译错误的原因是什么?

最佳答案

第一个代码片段的问题是在第一次使用之前没有定义或声明fun2()。编译器生成一个隐式函数声明,该声明返回一个int,但是fun2()的实际定义返回一个char**,这是冲突类型编译器错误的原因。要更正冲突类型错误,可以将fun2()的定义放置在fun2()的定义之前,或者将fun()的声明放置在calloc()的定义之前。
注意,一些calloc()调用的返回值没有分配给任何变量。
仅提及calloc()将所有位设置为零,根据C99标准:
请注意,这不必与浮点零或空指针常量的表示形式相同。
因此,使用NULLNULL指针数组可能是不正确的(实际上,我不知道是不是这样)。另一种方法是显式地将分配给指针数组中的每个元素。

10-08 20:02