C 将数组传递给函数
我使用calc函数,该函数基于矩阵计算一些数字,但我不知道当我访问calc函数中的变量时,为什么会出现seg错误。有人知道解决办法吗 编辑:C 将数组传递给函数,c,C,我使用calc函数,该函数基于矩阵计算一些数字,但我不知道当我访问calc函数中的变量时,为什么会出现seg错误。有人知道解决办法吗 编辑: 现在这就是它在calc函数中所做的一切。我有一些calc的东西,但是为了弄清楚如何访问这个变量,这些东西都被注释掉了。C中的二维数组并不像你想象的那样工作。(别担心,你并不孤单——这是一个常见的误解。) 代码中隐含的假设是,right是一个int*指针数组,每个指针指向一个int数组。可以这样做——而且,令人困惑的是,访问这样一个数组的语法是相同的,这可能
现在这就是它在calc函数中所做的一切。我有一些calc的东西,但是为了弄清楚如何访问这个变量,这些东西都被注释掉了。C中的二维数组并不像你想象的那样工作。(别担心,你并不孤单——这是一个常见的误解。) 代码中隐含的假设是,
right
是一个int*
指针数组,每个指针指向一个int
数组。可以这样做——而且,令人困惑的是,访问这样一个数组的语法是相同的,这可能就是造成这种误解的原因
C实际上做的是将right
做成一个由12个int
s组成的数组,在内存中连续排列。像这样的数组访问
int main(){
int right[2][3] = {
{1,4,6}, {2,7,5}
}
....
calc(right);
}
int calc(int ** right){
printf("%i", right[0][0]);
}
实际上相当于:
a=right[i][j];
要将数组传递给calc
函数,需要执行以下操作:
int *right_one_dimensional=(int *)right;
a=right[i*3 + j];
然后这样称呼它:
int calc(int *right, size_t d){
// For example
a=right[i*d + j];
}
编辑:关于这方面的更多背景知识,Binary Worrier评论中的问题绝对值得一看。尽管一维数组会自动转换为指针,但对于多维数组和多级指针,情况并非如此 如果您更改
calc
和main
函数的顺序(或者如果您在main
之前提供calc
的原型),编译器会投诉您可以将right
转换为int**
类型
原因是right
被声明为“3int
的4个数组的数组”。这可以自动转换为“指向3个数组的指针”(int(*)[3]
),但这就是转换停止的地方。
另一方面,calc
需要一个“指向int
的指针”,这与“指向3个int
数组的指针”完全不同
有两种可能的解决方案:
calc
以接受指向数组(或数组数组)的指针:right
更改为指向指针的指针:您需要发布
calc
函数的代码,以便任何人都能提供帮助。您可能试图访问整个数组,但您只能初始化right[0]和[1]IMO。您也可以粘贴calc的代码吗?为什么要使用int**right?许多问题可能重复,包括您还可以将calc指定为int-calc(int-right[][3])
并通过简单的操作调用calc(右)代码>
int right[2][3] = {
{1,4,6}, {2,7,5}
};
calc(&right[0][0], 3);
int calc(int right[][3])
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;