Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数组传递给函数_C - Fatal编程技术网

C 将数组传递给函数

C 将数组传递给函数,c,C,我使用calc函数,该函数基于矩阵计算一些数字,但我不知道当我访问calc函数中的变量时,为什么会出现seg错误。有人知道解决办法吗 编辑: 现在这就是它在calc函数中所做的一切。我有一些calc的东西,但是为了弄清楚如何访问这个变量,这些东西都被注释掉了。C中的二维数组并不像你想象的那样工作。(别担心,你并不孤单——这是一个常见的误解。) 代码中隐含的假设是,right是一个int*指针数组,每个指针指向一个int数组。可以这样做——而且,令人困惑的是,访问这样一个数组的语法是相同的,这可能

我使用calc函数,该函数基于矩阵计算一些数字,但我不知道当我访问calc函数中的变量时,为什么会出现seg错误。有人知道解决办法吗

编辑:
现在这就是它在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
被声明为“3
int
的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;