2016-11-21 3 views
0

그래서 다음과 같은 기능이 있습니다. 이 함수는 타겟 int ** double 포인터를 취하여 소스 배열을 복사합니다. 전 루프에 대한 이후의 printf를 호출하면2d int 배열을 C에서 double 포인터로 복사

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를 호출하면, 정확하게 [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 배열의 인덱스는 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(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]); 
} 
관련 문제