2014-01-12 49 views
2

我瀏覽過以前回答過的有關指針和矩陣的問題,但在這些情況下,矩陣被看作是指向指針的指針。但是,我試圖創建一個函數,它使用一個簡單的指針和另一個打印它的函數來讀取矩陣。 這是我的代碼,閱讀功能似乎正常工作,但程序在打印部分崩潰。如果我從printf語句中刪除了「*」,程序將工作(即它將數字從4打印到4我認爲這是正常的,因爲int存儲在4個字節中)。使用指針打印正方形矩陣

void readm(int *p,int n) 
{ 
p=(int *)malloc(sizeof(int)*n*n); 
for(int i=0;i<n*n;i++) 
     scanf("%d",p+i); 
} 

void printm(int *p,int n) 
{ 
    for(int i=0;i<n;i++) 
    { 
    for(int j=0;j<n;j++) 
     printf("%d ",*(p+(i*n)+j)); 
     printf("\n"); 
    } 
} 
+1

將此標記爲C可能更好。 – juanchopanza

+0

您是什麼意思程序崩潰? 'SEGFAULT'?你還可以使用這些函數包含代碼嗎? – Olotiar

+0

[不要從'malloc'返回](http://stackoverflow.com/a/605858/440558)。 –

回答

1

readm功能你有問題這一行:

p=(int *)malloc(sizeof(int)*n*n); 

在這裏你只分配到指針您本地副本。您調用readm時使用的變量將會更改而不是

你需要「通過引用」傳遞指針:

void readm(int **p,int n) /* Note pointer-to-pointer for `p` */ 
{ 
    *p=malloc(sizeof(int)*n*n); /* Note pointer-dereference of `p` */ 
    for(int i=0;i<n*n;i++) 
     scanf("%d",*p+i); /* Note pointer-dereference of `p` */ 
} 

你就必須使用運營商的地址,來調用該函數:

int *p; 
readm(&p, X); /* Note use of address-of operator */ 
+0

謝謝,它現在正常工作。起初,我認爲,鑑於我正在使用指針,它將在函數中受到的修改將在外部可見(我將此與以下事實相關聯,因爲當您希望參數的修改在外部可見時函數使用「&」來傳遞它,因此使用它的地址)。 – user2971971

1

的問題是,調用代碼即調用函數readm不知道函數變量p(定義爲該函數的參數)內部是否有新值。 p是函數的局部變量,它的生命在退出函數後結束。

你應該定義函數通過以下方式

void readm(int **p, int n) 
{ 
    *p = (int *)malloc(sizeof(int) * n * n); 
    for (int i=0; i<n*n; i++) scanf("%d", *p+i); 
} 

,並把它作爲

int *p; 

readm(&p, n); 

至於功能printm那麼就沒有任何必要重新聲明它作爲

無效printm (int ** p,int n)

因爲它沒有改變指針。我想改變的唯一事情是添加限定符常量

void printm(const int *p, int n); 
1

指向一個一維數組的定義是這樣的:

int *p1dArr; 

指向一個二維陣列被定義爲這樣:

int **p2dArr; 

您正在使用1D陣列,就像它是2D陣列一樣。這可能是你麻煩的根源。將您的函數定義更改爲以下內容:

void readm(int **p, int row, int col) 
{ 
    p = malloc(row * sizeof(*p)); 
    for(int r = 0; r < row; r++) 
     p[r] = malloc(col * sizeof(**p)) 

    for(int r = 0; r < row; r++) 
     for(int c = 0; c < col; c++) 
      scanf("%d", &p[r][c]); 
} 

void printm(int **p, int row, int col) 
{ 
    for(int r = 0; r < row; r++) 
    { 
     for(int c = 0; c < col; c++) 
      printf("%d ", p[r][c]); 
     printf("\n"); 
    } 
}