2011-03-04 13 views
1

나는 여기 Shawn Chin이 게시 한 방법을 사용하여 인접한 2 차원 배열을 생성 중입니다. [1] [2] 그것은 아주 잘 작동합니다. 자신의 게시물에서인접한 2D 배열의 재 할당

간단히 :

char** allocate2Dchar(int count_x, int count_y) { 
    int i; 

    # allocate space for actual data 
    char *data = malloc(sizeof(char) * count_x * count_y); 

    # create array or pointers to first elem in each 2D row 
    char **ptr_array = malloc(sizeof(char*) * count_x); 
    for (i = 0; i < count_x; i++) { 
     ptr_array[i] = data + (i*count_y); 
    } 
    return ptr_array; 
} 

그리고 다음과 같은 무료 기능 : 만 생각하지만

void free2Dchar(char** ptr_array) { 
    if (!ptr_array) return; 
    if (ptr_array[0]) free(ptr_array[0]); 
    free(ptr_array); 
} 

어느 차원에서 이에 상응하는 재 할당 함수를 작성하는 방법을 나에게 명확하지 않다 연속성을 유지하면서 행 수를 다시 할당하는 데 관심이 있습니다. 열의 수를 늘리는 것은 이해하기 쉽지만 아마도 매우 어려울 것입니다. 나는이 문제에 대한 직접적인 토론을 어디에도 발견하지 못했다. "어렵다!"[2]

물론 이것은 끔찍한 brute force 방법으로 데이터를 새로운 1D 배열 (위의 데이터)에 저장하여 저장하고 1D 배열을 다시 할당 한 다음 포인터 (ptr_array)를 free하고 다시 생성하여 새로운 크기의 행 요소 그러나 데이터를 복사하는 데 필요한 메모리 요구량을 최소한 두 배로 늘려야하기 때문에 행 수정에 다소 시간이 많이 걸립니다. 이는 열 수를 변경하는 경우 정말 끔찍한 일입니다.

이것은 행 수를 변경하는 방법의 예입니다 (데이터의 포인터에 대한 오프셋이 잘못되어 열 수를 변경하면 제대로 작동하지 않습니다). 나는 이것을 완전히 테스트하지는 않았지만, 아이디어를 얻었습니다 ...

플러스,이 방법은 불쾌한 이전 크기를 알아야합니다!

모든 의견을 크게 높이 셨습니다.

[1] How can I allocate a 2D array using double pointers?

[2]를 ptr_array[0]에서 원래의 데이터 배열에 쉽게 액세스 할 수 있기 때문에 http://www.eng.cam.ac.uk/help/tpl/languages/C/teaching_C/node52.html

답변

2

제의 malloc 및 방어 적이기는 불필요하다. realloc은 주소에서 할당 된 양을 기억하고 정확한 데이터 양을 이동해야하기 때문에 이전 크기를 알 필요가 없습니다.

이와 비슷한 기능이 작동합니다.

double ** 
reallocate_double_array (double **ptr_array, int count_row_new, int count_col) 
{ 
    int i; 
    int new_size = count_row_new * count_col; 

    double *data = ptr_array[0]; 
    data = realloc (data, new_size * sizeof (double)); 

    free (ptr_array); 

    ptr_array = calloc (count_row_new, sizeof (double *)); 

    for (i = 0; i < count_row_new; i++) 
    ptr_array[i] = data + (i * count_col); 

    return ptr_array; 
} 
+0

감사합니다. 이것은 정확하고 잘 작동합니다. – coastal