2012-09-27 4 views
1

동적 배열을 정의하고 정적 배열의 데이터를 동적 배열에 복사 한 다음 정적 배열로 다시 복사하려고했습니다. 그러나 데이터가 제대로 복사되지 않은 것으로 보입니다. 내가 뭐 잘못 했어요?동적 포인터 배열과 정적 배열 간의 데이터 복사

#include <stdio.h> 

int main(){ 
    int n = 2; 
    double a[2][2]; 
    double c[2][2]; 
    a[0][0] = 0.0; 
    a[0][1] = 0.1; 
    a[1][0] = 1.0; 
    a[1][1] = 1.1; 

    double* b = NULL; 
    double* p = NULL; 
    int i,j; 

    b = (double*) malloc(n*n*sizeof(double)); 

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      p = b+i; 
      *(p+j) = a[i][j]; 
     } 
    } 

    memcpy(c, b, sizeof(*b));  

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      p = b+i; 
      fprintf(stderr, "[%d][%d] = %.1f, c[%d][%d] = %.1f \n", i, j, *(p+j), i, j, c[i][j]);    
     } 
    } 

    free(b); 
    b = NULL; 

    return 0; 
} 

결과

[0] [0] = 0.0, C [0] [0] = 0.0

[0] [1] = 1.0, C [0] [1] = 0.0

[1] [0] = 1.0, C [1] [0] = 0.0

[1] [1] = 1.1, C [1] [1] = 0.0

+0

확인 코드 아래에 시도해야 내가 오류를 발견 , 메모리를 할당했다. 그것은 (i) memcpy (c, b, n * n * sizeof (* b))이어야합니다; 및 (ii) p = b + (i * n); – twfx

답변

0

sizeof(*b)memcpy입니다. 문제가 발생하면 방금 하나의 크기가됩니다. malloc에서 사용되는 크기를 변수 (또는 상수)에 저장하고이를 사용해야합니다.

1

문제 (또는 그들 중 하나) 대신 같은 것을해야하는

p = b+i; 
*(p+j) = a[i][j]; 

을 시도하고 있다고 할 수 있습니다

*(p+i*n+j) = a[i][j]; 

이유는 아마 당신은 저장하려는입니다 행별로 데이터를 포인터의 메모리에 저장하므로 i * n을 곱하는 것이 중요합니다. 시각화에 어려움이있는 경우 j = 0이라고 가정하면 행의 첫 번째 항목을 인덱스 0, n, 2 * n, ...에 넣을 수 있습니다.

1

은 내 의견에 따라로서 당신은 잘못 당신은

#include <stdio.h> 

int main() 
{ 
    int n = 2; 
    double a[2][2]; 
    double c[2][2]; 
    a[0][0] = 0.0; 
    a[0][1] = 0.1; 
    a[1][0] = 1.0; 
    a[1][1] = 1.1; 

    double** b = NULL; 
    int i,j; 

    b = (double**) malloc(n * sizeof(double*)); 
    for(i = 0; i < n; i++) 
     b[i] = (double *)malloc(n * sizeof(double)); 

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      b[i][j] = a[i][j]; 
     } 
    } 

    memcpy(c, b, (n*n*sizeof(double))); 

    for(i=0; i<n; i++){ 
     for(j=0; j<n; j++){ 
      printf("b[%d][%d] = %lf, c[%d][%d] = %lf, a = %lf\n", i, j, b[i][j], i, j, c[i][j], a[i][j]); 
     } 
    } 
}