2 차원 배열의 힙에 메모리를 할당하는 여러 가지 방법에 관심이 있습니다.배열에 대한 포인터와 포인터에 대한 포인터 할당
포인터에 대한 포인터와 하나 또는 여러 차원의 배열에 대한 포인터에 액세스 할 때 같은 표기법이 사용 된 것처럼 보입니다. 나는 누군가가 각각의 차이점과 유용성을 명확히하기를 희망했다. 둘 다 맞습니까?
이 첫 번째 방법은 포인터에 대한 포인터로 배열을 저장하는 것입니다 :
char **createTable(int r, int c) {
char **table;
int i;
char *offset;
table = malloc(r * sizeof (char *) + r * c * sizeof (char));
if (!table) return NULL;
offset = (char *) table + sizeof (char *) * r;
for (i = 0; i < r; i++) {
table[i] = offset + c * i;
}
return table;
}
이 다른 방법은 빠른 것 같다. 나는 다른 것과 같은 함수로 그것을 감싸는 좋은 방법을 생각할 수 없다.
char (*table)[c];
table = (char (*)[c]) calloc(r * c, sizeof (char));
배열이 정적 포인터와 비슷 함에도 불구하고 배열은 자체적으로 여러 차원을 가질 수 있습니다.
내가 설명한 첫 번째 방법은 정통 방법입니까?
두 가지 모두 동일한 것으로 보입니다. 두 번째는 확실히 더 우아합니다. –
왜'char table [r] [c]'를 쓰지 않는가? 포인터를 할당하는 함수에서 포인터를 반환 할 수 있습니다 귀하의 의도 같아요? 이 질문에서이 점을 명확히하는 것이 유용 할 수 있으므로 왜 우리가 왜'char table [r] [c];를 수행하지 않고 있는지 알 수있다. –
더 구체적으로 :'table'을 리턴 할 수 없다. 여기서'table '는 char **를 반환하는 함수에서'char (* table) [c];'입니다.Clang :'결과 유형이 'char **'인 함수에서 'char (*) [c]'를 반환하는 호환되지 않는 포인터 유형 –