C中函数的冲突类型

时间:2015-03-27 09:31:20

标签: c pointers

我正在尝试运行下面的代码,我收到以下错误消息。

程序:

int main()
{
    int (*res)[3],i;
    res=func();


}

int (*func())[3]
{
    static int arr[3][3]={1,2,3,4,5,6,7,8,9};
    return arr;
}

错误:

PointerTo1D.c: In function ‘main’:
PointerTo1D.c:6:5: warning: assignment makes pointer from integer without a cast [enabled by default]
  res=func();
     ^
PointerTo1D.c: At top level:
PointerTo1D.c:11:7: error: conflicting types for ‘func’
 int (*func())[3]
   ^
PointerTo1D.c:6:6: note: previous implicit declaration of ‘func’ was here 
 res=func();

有人可以帮我吗???

4 个答案:

答案 0 :(得分:2)

您必须将代码更改为

int** func()     //change here
{
    static int arr[3][3]={1,2,3,4,5,6,7,8,9};
    return arr;
}

int** func();   //forward declaration

int main()
{
    int ** res = NULL,i = 0;   //change here
    res=func();

    return 0;
}

main()调用的任何函数 这样comipler就可以在使用函数(被调用)之前知道函数签名。

注意:通常,为此目的使用main()不是一个好习惯。动态内存分配(main() / static)完全是为此目的而设计的。

答案 1 :(得分:2)

res是一个指向具有3个int

元素的数组的指针

int (*func())[3]:func是一个函数,它返回一个指向数组的指针,该数组包含3个int

元素

因为没有函数func()的原型,所以:

warning: implicit declaration of function 'func'
    res=func();

表示编译器使用默认原型int func()

有下一个警告:

warning: assignment makes pointer from integer without a cast [enabled by default]
     res=func();

因为使用了默认原型,编译器假定函数func()返回int,它被指定为指向res的指针

当达到函数func()的代码时,您会收到错误:

error: conflicting types for 'func'
 int (*func())[3]

解决方案是在main之前提供适当的原型。

int (*func())[3];

int main()
{
 ...
}

更新:还有警告:

warning: missing braces around initializer [-Wmissing-braces]
     static int arr[3][3]={1,2,3,4,5,6,7,8,9};

最好使用:

static int arr[3][3]={{1,2,3}, {4,5,6}, {7,8,9}};

答案 2 :(得分:0)

首先,如果你想返回一个像这样的指针:

(int **)func() {
 ...
 return arr;
 }

然后像这样定义res:

int ** res;
res = func();

答案 3 :(得分:0)

如果在没有声明可见的情况下调用函数,则假定它是旧式声明的,具有外部链接,并在C89中返回int

extern int func();

空括号(旧式声明)意味着:不需要参数检查,函数需要固定数量的默认提升参数。

在C99中,隐式声明已被删除,Gcc默认警告它们,但坚持旧行为,可能是为了向后兼容。如果您想坚持使用GNU89(我怀疑是根据给出的警告指定的话),可以将它们转换为错误,例如使用gcc -std=c99 -pedantic-errorsgcc -std=gnu89 -Werror=implicit-function-declaration

要解决此问题,至少需要在使用前声明该函数:

int (*func())[3];

int main() {
    func();
}

这仍然使用旧式声明,在所有C标准中标记为过时,我建议使用原型来确保参数检查:

int (*func(void))[3];

int main(void) { /* ... */ }