我正在尝试在Workbench中编译以下简单代码:
1. typedef float matrixType[3][3]
2.
3. void my_func(matrixType matrix)
4. {
5. printf("matrix[0][0] = %g\n",matrix[0][0]);
6. }
7.
8. void main()
9. {
10. matrixType my_matrix = {{0,1,2},{3,4,5},{6,7,8}};
11. matrixType* ptr_matrix = &my_matrix;
12.
13. my_func(*ptr_matrix);
14. }
我收到以下警告:
test.c:13: warning: passing arg 1 of `my_func' from incompatible pointer type
我无法理解,我做错了什么。在Visual Studio中编译相同的代码没有任何警告,但在Workbench中出现了问题。
感谢。
答案 0 :(得分:1)
您在第1行末尾缺少分号。
答案 1 :(得分:1)
如果gcc (GCC) 4.5.3
启用了所有警告,则在进行以下更改后,它还会编译正确的:
#include <stdio.h>
。main
的返回类型更改为int
。return 0;
作为最后一行。 void main()
不正确C,即使它出现在各种书籍,手册和网络教程中。在某些体系结构上,它会导致奇怪的问题,通常是在程序终止时。
获取数组类型的地址对工作台类型检查器提出了挑战。我不打算拖出C标准来确定工作台警告是否正确。这可能是一个错误。
但我很确定如果你以这种方式重新编码,你会发现任何编译器都没有错误:
#include <stdio.h>
typedef float rowType[3];
typedef rowType matrixType[3];
void my_func(matrixType matrix)
{
printf("matrix[0][0] = %g\n",matrix[0][0]);
}
int main()
{
matrixType my_matrix = {{0,1,2},{3,4,5},{6,7,8}};
rowType* ptr_matrix = my_matrix;
my_func(ptr_matrix);
return 0;
}
原因是my_matrix
会自动转换为指向它的第一个元素
rowType* ptr_matrix = my_matrix;
这与
一样char s[] = "hello world!";
char *p = s;
数组名s
将转换为指向其第一个元素的指针。
void my_func(matrixType matrix)
中的参数的类型与rowType*
相同,因为所有数组也作为指向第一个元素的指针传递。因此,此代码中的所有类型必须以在C标准中非常明确定义的方式匹配。 &my_matrix
可能不正确,但它是一个“边缘情况”,更有可能暴露类型检查错误。