2012-08-14 2 views
0

내 2D 배열의 크기를 늘리려고하고 있는데, hm은 배열의 x 길이를 포함하는 구조체입니다. 배열의 끝을 나타 내기 위해 -99999991 값을 사용하고 있습니다.아무도 나를이 2D 배열을 디버깅하는 데 도움이 될 수 있습니까?

올바른 방법인가요?

hm->value = realloc(hm->value,(hm->x+1)*sizeof(int)); 
      hm->value[hm->x] = malloc(sizeof(int)); 
      hm->value[hm->x][0] = -999999991; 
      hm->value[hm->x-1] = realloc(hm->value[hm->x-1],2*sizeof(int)); 
      hm->value[hm->x-1][1] = -999999991; 
      hm->value[hm->x-1][0] = value; 
+0

메모리의 다각형이나 "직사각형"과 비슷합니까? –

+0

배열 내의 배열. 나는 당신이 그것을 사각형이라고 부를 수 있다고 생각한다. ... – caspnet

+0

맞아, 내가 얻는 것은 "2d"할당은 보통 단지'malloc (x_dim * y_dim * sizeof (element_t))'이다. 이것은 아주 다른 것입니다. 아마도 유스 케이스를 더 자세하게 설명해야 할 것입니다. –

답변

1

크기를 조정할 수있는 2D 배열이 없으면 int에 대한 포인터에 대한 포인터가 있습니다.

배열 :

int A[n][m]; 
Accessing the array: A[2][3] = 4; // Equivalent to *(A + 2*m + 3) 

변수 크기의 2 차원 "배열"배열 한 차원 인 경우

int **A; 
A = malloc(n*m*sizeof(int)); 
A[2][3] = 4; // Equivalent to *A + 2*??? + 3) 

이 컴파일러는 모르는, 또는 그 다음 무엇을 차원이있는 경우 2 차원의 크기가 있습니다. 더 이상 이것을 계산할 수 없습니다. 또한 realloc은 데이터를 올바른 위치에 놓을 수 없습니다. 2x3이다의 2D 배열가는 × 2 차원 어레이를 고려

int **A = {{0,1}, {2,3}}; // for berevity - this isn't valid C! 
// stored in memory as [0,1,2,3] 
A = realloc(A, 2*3* sizeof(int)); 
메모리에 저장

새로운 배열이 [0, 1, 2, 3]이고; 데이터를 복사해야했습니다.

이 개 괜찮은 솔루션이 있습니다 (그들이 아니지만 꽤) : 1)

int **A; 
A = malloc(m*sizeof(void *)); 
for (i = 0; i < m; ++i) { 
    A[i] = malloc (n*sizeof(int); 
} 

가 (지금 realloc을이 배열 모두에서 작동합니다 1D 배열의리스트로 2 차원 배열을 치료하지만, 요소를 액세스 할 때 포인터 연산 대신 두 개의 포인터 역 참조가 필요합니다.) 2) 배열의 차원 중 하나가 고정되어 있으면 메모리에 2D 배열을 사용하고 필요에 따라 다시 할당 할 수 있습니다. 우리는 항상 우리의 2 차원 배열의 끝에서 성장이 두 번째 예에서
#define M 16 
int **A; 
A = malloc(M*n*sizeof(int)); // realloc also works 
// access an element: 
*(A + 3*M + 2) = 4; // (3*M is compile time constant) 

는 (그래서 2 × 2 × 2에서가는 나의 예를 불법 - 두 번째 2는 고정 길이).

+0

시간을내어 주셔서 감사합니다! – caspnet

관련 문제