我正在尝试运行下面的代码,我收到以下错误消息。
程序:
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();
有人可以帮我吗???
答案 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-errors
或gcc -std=gnu89 -Werror=implicit-function-declaration
。
要解决此问题,至少需要在使用前声明该函数:
int (*func())[3];
int main() {
func();
}
这仍然使用旧式声明,在所有C标准中标记为过时,我建议使用原型来确保参数检查:
int (*func(void))[3];
int main(void) { /* ... */ }