将二维数组传递给函数

时间:2012-07-19 16:38:29

标签: c arrays pointers typedef

我正在尝试在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中出现了问题。

感谢。

2 个答案:

答案 0 :(得分:1)

您在第1行末尾缺少分号。

答案 1 :(得分:1)

如果gcc (GCC) 4.5.3启用了所有警告,则在进行以下更改后,它还会编译正确的

  1. 在第一行之后添加分号。
  2. 在顶部添加#include <stdio.h>
  3. main的返回类型更改为int
  4. 添加return 0;作为最后一行。
  5. 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可能不正确,但它是一个“边缘情况”,更有可能暴露类型检查错误。