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函数中所做的一切。我有一些计算方法,但是所有注释都试图弄清楚如何访问这个变量。
答案 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)
虽然一维数组会自动转换为指针,但对于多维数组和多级指针来说,这同样不适用。
如果您更改calc
和main
功能的顺序(或者如果您在calc
之前提供main
的原型),您将收到来自编译器,它可以将right
转换为类型int**
。
原因是right
被声明为“4个3 int
数组的数组”。这可以自动转换为“指向3 int
数组的指针”(int (*)[3]
),但转换停止的位置。
另一方面,calc
需要一个“指向int
的指针”,这是一个与“3 int
数组的指针完全不同的”。
有两种可能的解决方案:
calc
以接受指向数组(或数组数组)的指针: int calc(int right[][3])
right
更改为指针指针: 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;