2015-10-18 72 views
0

当我尝试将我的数组传递给函数并打印它的值时,出现Segmentation fault错误。我对C编程非常陌生,并试图弄清楚很长一段时间。任何帮助将不胜感激。如果可能,请向我展示带有示例代码的解决方案。打印数组时出现分段错误

#include<stdio.h> 
#include<stdlib.h> 

void myfun(int **arr); 

int main(int args, char** argv) 
{    
    int arr[3][3] = {{3, 8, 6}, {2, 3, 2}, {4, 1, 2}}; 
    myfun((int **) arr[3]); 
    return 0; 
} 

void myfun(int **arr) 
{ 
    int i; 
    for(i=0; i<3; i++) 
    {  
     printf("arr[1][i]:%d\n",arr[1][i]);//Gives Segmentation fault 
    } 
} 
+0

我以前见过这个。最近。 –

回答

1

除了你的函数参数的问题,您还可以在函数换你的数组索引。即:

#include<stdio.h> 
#include<stdlib.h> 

void myfun (int arr[][3]); 

int main (void) 
{    
    int arr[3][3] = {{3, 8, 6}, {2, 3, 2}, {4, 1, 2}}; 
    myfun (arr); 

    return 0; 
} 

void myfun (int arr[][3]) 
{ 
    int i; 

    for(i=0; i<3; i++) 
    {  
     printf (" arr[i][1]:%d\n", arr[i][1]); // OK now 
    } 
} //result show 8, 3, 1 

输出

$ ./bin/arr_pass_2d 
arr[i][1]:8 
arr[i][1]:3 
arr[i][1]:1 

注:arr[i][1]arr[1][i]

此外,如果您更新的功能,您printf电话,您可以包括行值以及。例如: -

printf (" arr[%d][1]:%d\n", i, arr[i][1]); 

输出

$ ./bin/arr_pass_2d 
arr[0][1]:8 
arr[1][1]:3 
arr[2][1]:1 
+0

非常感谢您向我们展示所有细节和解释。这是一个很大的帮助 –

+0

很高兴我能提供帮助,当我们开始的时候,我们都需要一些帮助。 –

1

您不能将二维数组作为双指针传递。对于多维数组,该功能需要知道除最后一个之外的所有维度。

所以定义myfunc这样的:

void myfun(int arr[3][3]); 

,并调用它是这样的:

myfun(arr); 
+0

“该功能需要知道除最后一个之外的所有维度。” - 几乎 - “功能需要知道最后一个。” 'void myfun(int arr [] [3]);'很好。 –

+0

@dbush感谢您用示例展示。当我按照你的建议进行修改时,我得到以下两个错误:'1)错误:从'int(*)[3]'到'int''的无效转换'2)错误:初始化'void myfun(int)'' –