将数组传递给函数

时间:2010-09-08 07:35:26

标签: c

int main(){

    int right[2][3] = {
    {1,4,6}, {2,7,5}
    }

    ....


    calc(right);
}

int calc(int ** right){
    printf("%i", right[0][0]);
}

我计算基于矩阵计算一些数字的函数,但我不知道为什么当我在calc函数内访问变量时我得到seg错误。有没有人知道解决方案?

编辑: 现在这就是它在calc函数中所做的一切。我有一些计算方法,但是所有注释都试图弄清楚如何访问这个变量。

2 个答案:

答案 0 :(得分:7)

C中的二维数组不像您认为的那样工作。 (别担心,你并不孤单 - 这是一种常见的误解。)

代码中隐含的假设是right是一个int *指针数组,每个指针都指向一个int数组。 可能以这种方式完成 - 并且,令人困惑的是,访问这样一个数组的语法是相同的,这可能是导致这种误解的原因。

C 实际上做的是让right成为12 int的数组,在内存中连续排列。像这样的数组访问

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的评论相关的问题绝对值得一看。

答案 1 :(得分:2)

虽然一维数组会自动转换为指针,但对于多维数组和多级指针来说,这同样不适用。

如果您更改calcmain功能的顺序(或者如果您在calc之前提供main的原型),您将收到来自编译器,它可以将right转换为类型int**

原因是right被声明为“4个3 int数组的数组”。这可以自动转换为“指向3 int数组的指针”(int (*)[3]),但转换停止的位置。 另一方面,calc需要一个“指向int的指针”,这是一个与“3 int数组的指针完全不同的”。

有两种可能的解决方案:

  1. 更改calc以接受指向数组(或数组数组)的指针:
  2.    int calc(int right[][3])
    1. right更改为指针指针:
    2.     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;