代码之家  ›  专栏  ›  技术社区  ›  Anatoli

向函数传入数组

c
  •  0
  • Anatoli  · 技术社区  · 15 年前
    int main(){
    
        int right[2][3] = {
        {1,4,6}, {2,7,5}
        }
    
        ....
    
    
        calc(right);
    }
    
    int calc(int ** right){
        printf("%i", right[0][0]);
    }
    

    我计算函数,计算一些数字的基础上的矩阵,但我不知道为什么我得到seg错误时,我访问变量的权利在calc函数。有人知道解决办法吗?

    编辑: 现在这就是它在计算函数中所做的一切。我有一些计算的东西,但它的所有注释出试图找出如何访问这个变量。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Martin B    15 年前

    C语言中的二维数组并不像你想象的那样工作。(别担心,你并不孤单——这是一个常见的误解。)

    代码中隐含的假设是 right 是一个数组 int * 指针,每个指针指向 int . 它 能够

    什么C 事实上 是做什么 正确的 12个数组 内景

    a=right[i][j];
    

    实际上相当于:

    int *right_one_dimensional=(int *)right;
    a=right[i*3 + j];
    

    把你的阵法传给 calc

    int calc(int *right, size_t d){
        // For example
        a=right[i*d + j];
    }
    

    然后这样称呼:

    int right[2][3] = {
        {1,4,6}, {2,7,5}
    };
    
    calc(&right[0][0], 3);
    

    编辑:关于这方面的更多背景知识,Binary Worrier评论中的问题绝对值得一看。

        2
  •  2
  •   Bart van Ingen Schenau    15 年前

    尽管一维数组会自动转换为指针,但对于多维数组和多级指针,情况并非如此。

    如果你改变顺序 calc main 计算 之前 ),编译器会投诉它可以转换 right 到类型 int**

    原因是 声明为“4数组3数组 int ". 这可以自动转换为“指向3的数组的指针” 内景 " ( int (*)[3] ),但这就是转换停止的地方。 计算 ,这与“指向3的数组的指针”完全不同 内景 ".

    有两种可能的解决方案:

    1. 改变 计算 要接受指向数组(或数组数组)的指针,请执行以下操作:
       int calc(int right[][3])
    1. 正确的 要成为指向指针的指针:
        int temp_array[4][3];
        int* temp_array2[4] = { temp_array[0], temp_array[1], temp_array[2], temp_array[3] };
        int** right = temp_array2;