2014-02-18 2 views
0

C에서 비터 비 디코더를 구현하려고했습니다.2 차원 배열에 대해 메모리를 재 할당하는 방법은 무엇입니까?

그래서 동적으로 생성하고 싶은 2 차원 배열을 사용하려고 생각했습니다. 여기에 2 차원 배열에 대한 샘플 코드는 동적으로 생성됩니다

place_table = (int **)malloc((no_places+1)*sizeof(int *)); 

for(i = 1; i <= no_places; i++) 
    place_table[i] = (int *)malloc((no_places+1)*sizeof(int)); 
이 2 차원 배열의 크기 즉, 내 디코더에서 변화에 유지

no_places는 다양한 계속해서, 그래서 메모리를 재 할당하는 방법을 알고 싶어 2 차원 배열

모든 제안이나 도움을 주시면 감사하겠습니다.

+2

대부분 'realloc'을 사용합니다. – jweyrich

+1

''2D 배열 '에 대해 이야기하고 있습니까? – herohuyongtao

+0

2 차원 포인터를 사용하여 생성 된 2 차원 배열 – shreyas

답변

2

은 동적으로서 2-D 어레이에 대한 (C99)에 메모리를 할당 할 수

int no_places; 
int n = no_places + 1; // for brevity in the following statement 
int (*place_table)[n] = malloc(sizeof(int[n][n])); 

// check for NULL 
if(place_table == NULL) { 
    // there's a problem 
    // handle it 
} 
else { 
    // you are good to go 
} 

이 때문에 치수 변화가 2-D 어레이 place_table 메모리 재 할당 정확하지 않을 이전 배열의 값은 새로운 배열의 요소 인 것처럼 재 해석됩니다. 이렇게하면 행이 줄 바꿈됩니다. (예의 Pete Kirkham). 따라서 새 배열을 할당하고 이전 배열의 값을 복사 한 다음 이전 배열을 해제해야합니다.

int old_n = n; 
// value of n has been changed 
// allocate a new array 
int (*new_place_table)[n] = malloc(sizeof(int[n][n])); 

// check for NULL and accordingly proceed 
// if not NULL, copy place_table to new_place_table 

for(int i = 0; i < old_n; i++) { 
    for(int j = 0; j < old_n; j++) { 
     new_place_table[i][j] = place_table[i][j]; 
    } 
} 

free(place_table); 

// do stuff with new_place_table 

free(new_place_table); 

malloc의 결과를 전송할 필요가 없습니다. 이렇게하면 이점이 없으며 stdlib.h 헤더 파일을 포함하지 않은 경우 버그, 정의되지 않은 동작 및 프로그램 충돌이 발생할 수 있습니다. 자세한 내용은 here을 참조하십시오.

+2

첫째, realloc이 실패하면 이전에 'place_table'이 가리키는 저장소에 대한 참조를 잃어 버렸습니다. 두 번째로, 값은 일반적인 인접한 2D 배열 구현을 사용하여 각 행의 길이가 변경 될 때마다 바뀝니다. 따라서 새 저장소를 할당하고 해당 위치에 다시 할당하지 말고 값을 복사하려고합니다. –

+0

@PeteKirkham 첫 번째 사항은 확실하지 않지만 충분한 메모리를 할당하지 못하면'realloc'은'place_table'을 그대로 둡니다. 두 번째 요점은 맞습니다. – ajay

+2

아니요, 'realloc'은 실패 할 경우 0을 반환합니다. 따라서 place_table은 0이 될 것이고 이전에 place_table이 가리키는 저장소에 도달 할 방법이 없습니다. realloc 결과를 임시로 저장 한 다음 0으로 테스트 한 후 할당해야합니다. –

관련 문제