2013-05-29 3 views
-3

할당 할 2D 배열 함수를 정의해야하지만 malloc은 한 번만 호출해야합니다. C 배열에 하나의 malloc을 가진 2D 배열 할당 함수

나는 (-std = C99)을 할당하는 방법을 알고 :

int (*p)[cols] = malloc (sizeof(*p) * rows); 

하지만 함수에서 반환하는 방법을 알아낼 수 없습니다. 함수가 끝나면 (또는 적어도 그 일부) 배열이 존재를 멈추기 때문에 Return은 옵션이 아닙니다. 따라서,이 함수에 배열을 전달하는 옵션 만이 parametr이지만, 위의 솔루션은 선언에서 cols의 수를 정의해야합니다. 심지어 가능할까요?

감사합니다. 사용자에게

덕분에 내가 이런 식으로이 문제를 해결하기 위해 관리 kotlomoy :

... 
#define COLS 10 
#define ROWS 5 

int (*Alloc2D())[COLS] 
{ 
    int (*p)[COLS] = malloc(sizeof(*p) * ROWS); 
    return p; 
} 

//and this is example how to use it, its not elegant, 
//but i was just learning what is possible with C 

int main(int argc, char **argv) 
{ 
    int (*p)[COLS] = Alloc2D(); 
    for (int i = 0; i < ROWS; i++) 
     for(int j = 0; j < COLS; j++) 
      p[i][j] = j; 

    for (int i = 0; i < ROWS; i++){ 
     for(int j = 0; j < COLS; j++) 
      printf("%d", p[i][j]); 
     printf("\n"); 
    } 

    return 0; 
} 
+0

당신은 정말'추가해야 c99' 태그 – kotlomoy

답변

0
int * Alloc2D(int rows, int cols) 
{ 
    return malloc(sizeof(int) * rows * cols); 
} 

사용.

int * array = Alloc2D(rows, cols); 

이 요소 [I, J] 얻으려면 :

는 할당 할 수

array[ cols * i + j ] 

를 그리고 메모리 청소하는 것을 잊지 마세요 :

free(array); 
+1

이것은 1D 배열입니다 ... –

+0

기술적으로, C에 2D 배열이 없습니다 ... 심지어'int 배열 [3] [4]'는 2D가 아닙니다 정렬. 1D 배열의 1D 배열입니다. 그러나 그러한 배열로 동적으로 작업 할 수는 없습니다. 오직 하나의'malloc'을 가진 해결책 만이 당신에게 준 것입니다. 또 다른 해결책은 포인터의 배열을 행에 할당 한 다음 루프의 각 행을 할당하는 것입니다. – kotlomoy

+0

2d는 [] []로 색인 할 수있는 첫 번째 코드 줄이 가능한 ... 1D 배열의 1D 배열 - 예,하지만 결국은 2D 배열과 같은 역할을합니다. –