2012-07-22 67 views
-4
void f(int **m, int w, int h) 
{  
int i,j; 

    for(i=0;i < w ; i++) 
    {  
     for(j=0;j<h;j++) 
     { 
     printf("%5d", m[i][j]); // *(*(m + i) + j) ?? 
     } 

    printf("\n"); 
    } 
    return; 
} 


int main() 
{ 

int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 


f(a,3,3); 

} 

這段代碼試圖打印二維矩陣 但我得到一個分段錯誤。爲什麼會發生這種代碼拋出賽格故障

+3

什麼是您的矩陣創建代碼? – 2012-07-22 18:02:03

+1

你可能走出陣列的末端。我們需要看到聲明/分配的m和值爲w,h – pb2q 2012-07-22 18:02:09

+2

這是我見過的最快的downvote螺旋:) – 2012-07-22 18:03:05

回答

1

您的矩陣不是int **類型,其類型是int[3][]

int **表示指向指針數組的指針。你沒有一個指針數組,你有一個3整數數組的數組。這不是一回事。

如果你希望你可以改變你的代碼來考慮這一點。

int *addr = (int *)m; // This is the address of m[0][0] 

要訪問M [i] [j]使用:

int elem = addr[i*h+j]; 
+1

說明(參數):http://ideone.com/sbEb5 – chris 2012-07-22 18:09:18

+0

這就是我認爲......這五個投票讓我問這個問題\t stackoverflow.com/questions/10625547/pass-matrix-as-argument – GionJh 2012-07-22 18:13:09

1

一個指針,一個指向int是不一樣的一個3x3陣列。

您應該有所不同聲明你的功能,或準備數組不同:

變化f這樣:

void f(int m[][3], int w, int h) 

或準備數組是這樣的:

int r0[] = {1,2,3}; 
int r1[] = {4,5,6}; 
int r2[] = {7,8,9}; 
int *a[] = {r0,r1,r2}; 
f(a,3,3); 
1
int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 

傳遞到f不起作用,a的類型與f預期的類型不兼容。當傳遞給函數時,a被轉換爲類型爲int (*)[3]的指針,指向三個數組的指針int

f需要指向指向int的指針。你的編譯器應該告訴你關於不兼容的類型。

,會發生什麼是未定義的行爲,可能是當在f解除引用m,第一sizeof(int*)字節數組內容解釋爲一個指針和隨後,導致訪問未分配存儲器。

相關問題