返回类型为二维数组

时间:2012-11-06 09:23:40

标签: 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]=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();
}

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

2 个答案:

答案 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 **));