2016-11-21 11 views
0

次のような機能があります。この関数は、ターゲットint ** doubleポインタをとり、ソース配列をその配列にコピーします。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]); 
} 

私はループの後のprintfを呼び出すと、私はセグメンテーションフォルトを得るが、私はループの内側のprintfを呼び出す場合、それは[I] [J]が正しくターゲットを出力します。どうしてこれなの?私はこの上に私の髪を引き裂いている...

+2

'i'と' j'の値がループの外にあると期待しますか? – nullpointer

+4

ポインタを '** target'に渡す必要がありますので、' *** target'になります。そして、割り当てるときに '* target = ...'を使います。あなたは現在、それが指している値ではなく、(ダブル)ポインタ自体を修正しようとしています。 – Evert

+1

また、http://stackoverflow.com/a/7307699/1746118 – nullpointer

答えて

1

i == mj == n:コード修正

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]); 
} 

。彼らは両方とも、最大の1アイテムを指しています。 Cの配列は0でインデックス付けされているため、[n][m]の配列のtarget[n][m]にアクセスすると、範囲外のアクセスが発生します。

0

私はなぜ最初にポインタの配列を作成したいのですか?この方法では、呼び出し元に反映されないダブルポインタ自体を変更する問題が発生します。入力2D配列を格納するために配列を直接割り当てることができます。

あなたのコード:ループした後

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]); 
}