크기를 조정할 수있는 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는
고정 길이).
메모리의 다각형이나 "직사각형"과 비슷합니까? –
배열 내의 배열. 나는 당신이 그것을 사각형이라고 부를 수 있다고 생각한다. ... – caspnet
맞아, 내가 얻는 것은 "2d"할당은 보통 단지'malloc (x_dim * y_dim * sizeof (element_t))'이다. 이것은 아주 다른 것입니다. 아마도 유스 케이스를 더 자세하게 설명해야 할 것입니다. –