2016-11-21 44 views
0

所以我有以下功能。該函數採用目標int **雙指針並將源數組複製到它。將2d int數組複製到C中的雙指針

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    target = (int **) malloc(m * sizeof(int *)); 
    for (i = 0; i < m; i++) 
    target[i] = (int *)malloc(n * sizeof(int)); 

    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    target[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", target[i][j]); 
} 

當我在for循環調用printf,我得到了段錯誤,但如果我調用printf裏面的for循環,它打印正確目標[i] [j]。爲什麼是這樣?我正在撕掉我的頭髮...

+2

你認爲'i'和'j'的值在循環之外? – nullpointer

+4

你需要將指針傳遞給你的'** target',所以它變成'*** target'。然後在分配時使用'* target = ...'。您目前正在嘗試修改(雙)指針本身,而不是它指向的值。 – Evert

+1

也看看http://stackoverflow.com/a/7307699/1746118 – nullpointer

回答

1

的循環後,i == mj == n。他們都指出超過最大1項。 C中的數組是零索引的,因此訪問大小爲[n][m]的數組的target[n][m]將提供超出邊界的訪問權限。

0

我不清楚爲什麼你想要先創建一個指針數組。採用這種方法,你最終會遇到一個修改雙指針本身的問題,它不會反映到調用者中。你可以直接分配一個數組來存儲輸入的二維數組。

您的代碼:

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    target = (int **) malloc(m * sizeof(int *)); 
    for (i = 0; i < m; i++) 
    target[i] = (int *)malloc(n * sizeof(int)); 

    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    target[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", target[i][j]); 
} 

修改代碼:

void copyMatrix(int ** target, int m, int n, int source[m][n]) 
{ 
    int i,j; 

    *target = (int *) malloc(sizeof(int) * (m * n)); 


    for(i=0; i < m; i++){ 
    for(j=0; j < n; j++){ 
    (*target)[i][j] = source[i][j]; 
    } 
    } 
    printf("%d ", (*target)[i][j]); 
}