2013-11-21 6 views
2

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)); 

배열이 정적 포인터와 비슷 함에도 불구하고 배열은 자체적으로 여러 차원을 가질 수 있습니다.

내가 설명한 첫 번째 방법은 정통 방법입니까?

+1

두 가지 모두 동일한 것으로 보입니다. 두 번째는 확실히 더 우아합니다. –

+0

왜'char table [r] [c]'를 쓰지 않는가? 포인터를 할당하는 함수에서 포인터를 반환 할 수 있습니다 귀하의 의도 같아요? 이 질문에서이 점을 명확히하는 것이 유용 할 수 있으므로 왜 우리가 왜'char table [r] [c];를 수행하지 않고 있는지 알 수있다. –

+0

더 구체적으로 :'table'을 리턴 할 수 없다. 여기서'table '는 char **를 반환하는 함수에서'char (* table) [c];'입니다.Clang :'결과 유형이 'char **'인 함수에서 'char (*) [c]'를 반환하는 호환되지 않는 포인터 유형 –

답변

1

제대로 입력해야하는 가변 길이 배열에 대한 포인터를 반환하는 함수가없는 것 같습니다. 이 같은 해트트릭을 갈 수 :

#include <stddef.h> 
#include <stdlib.h> 

void* createTable_(size_t r, size_t c) { 
    char (*table)[c] = malloc(sizeof(char[r][c])); 
    /* do the intialization that you need */ 
    return table; 
} 

#define createTable(R, C) ((char(*)[C])createTable_((R), (C))) 

int main(int argc, char*argv[]) { 
    char (*table)[argc] = createTable(argc, argc); 
} 

기능은 단지 void* 포인터를 반환하고 매크로는 정확한 타이핑을 보장합니다. 불행히도 이러한 매크로는 두 번째 인수를 두 번 평가해야하므로 부작용에주의해야합니다.

편집, 당신이 물어 다른 하위 질문 :

나는 "정통"다차원 행렬을 모방 포인터 방법에 대한 포인터를 호출 할 것이다, 그냥-일자. 최소한 내가 본 대부분의 사용법을위한 것입니다.

  • 오류가 발생하기 쉽습니다. 실제로 모든 색인 계산을 수행해야합니다. . BTW 또한 당신은 sizeof(char*[c]) 부분

    malloc(sizeof (char*[r]) + sizeof (char[r][c]))

  • 그것은 공간을 낭비처럼, 배열에 뭔가를 sizeof를 사용하여 더 읽기 뭔가가 얻을 수

  • 대신 간단한 인덱스 계산의 효율성이 떨어집니다 추가 간접 검색을 수행해야합니다.

  • Fortran과 같이 많은 행렬을 사용하는 다른 언어와 호환되지 않습니다.

+0

이것은 대답하는 부분에 대한 훌륭한 대답이지만 두 가지 접근 방식을 비교하는 부분은 높이 평가할 것입니다. – niic

관련 문제