【问题标题】:Return type as a two dimensional array返回类型为二维数组
【发布时间】:2012-11-06 17:45:04
【问题描述】:

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

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

【问题讨论】:

  • 第二个sn-p完成了吗?我没有看到 fun2() 的定义。
  • 第二个在fun()的前两行泄漏内存。

标签: c calloc


【解决方案1】:

第一个代码sn-p的问题是fun2()在第一次使用之前没有被定义或声明。编译器生成一个返回 int 的隐式函数声明,但 fun2() 的实际定义返回 char**,这是冲突类型编译器错误的原因。要更正冲突类型错误,您可以将fun2() 的定义或fun2() 的声明放在fun() 的定义之前。

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

顺便提一下calloc() 将所有位设置为零,根据 C99 标准:

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

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

【讨论】:

  • 我会选择前者——在模块头中为所有函数声明原型没有开销,但它可以清楚地说明你在定义什么。
  • 在此基础上,c 主要被声明为 char**,但 fun 被声明为返回 char***,编译器也应该对此发出警告。
【解决方案2】:

编译器还没有看到fun2() 的定义。您必须在 fun2() 前面声明函数:

char ** fun2();

char ***  fun(){
...

或将 fun2() 移到 fun() 之前:

char ** fun2(){
...
}

请注意,在这两种情况下,您都没有为b 分配值,并且calloc() 分配的内存丢失了。您应该将其修改为:

char *** b = calloc(10,sizeof(char **));

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多