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()它在第一次使用之前没有被定义或声明。编译器生成一个隐式函数声明,该声明返回 anint但是实际定义fun2()返回 a char**,这是冲突类型编译器错误的原因。要更正冲突的类型错误,您可以将 的定义fun2()或声明置于 的fun2()定义之前fun()

请注意,某些calloc()调用的返回值并未分配给任何变量。

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

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

所以对指针数组的使用calloc()可能NULL正确的(实际上我不知道这是否曾经是这种情况)。另一种方法是显式分配NULL给指针数组中的每个元素。

于 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 回答