2015-10-18 75 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)'' –