2차원 포인터를 C에서 선언을 하면 이 공간을 어떻게 할당해야 할까?
오늘 C로 프로그래밍 하는 도중에 내가 맞이한 문제였다. 지금 JPEG Decoding을 해서 FFT알고리즘을 수행하는 부분을 짜는데 JPEG을 Decoding하는 부분에서 integer 2-D 배열을 complex 2-D 배열로 변환하는 과정에서 생긴 의문이다.
C에서 2차원 포인터는 아래와 같이 선언한다.
type ** variable;포인터는 동적 할당을 가능케 하기 때문에 미리 변수를 선언 한 후, 이미지 사이즈를 구한 뒤 공간을 할당하는 방식이었다. 1차원 포인터는 간단하게 malloc함수를 이용해서 할당을 하면 된다. ( malloc(size) ) 하지만 2차원 포인터는 어떻게 할당을 해야 할까?
아래의 방법은 몇권의 책을 뒤져봐도 나와있지 않더라. -_-;; 내가 이상한 책만 본건지도 모르겠다. 정답은 malloc을 순차적으로 호출하는 것이다. 2차원 포인터이기 때문에 상위 포인터 배열을 malloc 한 다음 그 다음 차원의 배열을 하나씩 malloc으로 할당해 준다.
variable = (type **)malloc(sizeof(type)size);
for(loop) { variable[i] = (type )malloc(sizeof(type)size2); } 위의 방법으로 최초의 포인터를 위한 포인터 공간을 할당 한 후, 사용하기 바로 전에 다시 각 포인터의 공간을 allocation 하는 방식으로 사용한다.
조금 생각해보면 나올만한 답이었는데 나는 왜 못찾은 것인지 -_-;;;;
Comments (4)
jpeg라면 8 by 8 배열인가요? 그럼 이렇게 할당하는 게 좀 더 낫지 않았을까요.
typedef typet type8by8t[8][8]; type8by8t *blah = (type8by8t*)malloc(sizeof(type8by8_t));좀 더 정확하게, blah[n][3][4]처럼 뒷부분의 “변경되지 않는” 배열 첨자를 한꺼번에 할당하는 게 더 도움이 됩니다. 왜냐하면 그것 자체가 type이거든요.
토끼군 // 아 ^^ JPEG을 DCT하는 과정에서는 8X8 로 선언하는 것이 당연하지만 제가 사용한 부분은 dct가 끝나고 이미지를 line 단위로 scan 할 때에 쓰이는 부분이었습니다.
charater (width x height) 의 데이터를 fft를 하기 위한 complex로 바꾸기 위해선 이미지 데이터와 동일한 사이즈의 메모리 공간을 할당할 필요가 있었거든요. C에서는 미리 변수를 선언해 놓아야 하니 이미지 사이즈가 어떻게 될지 알 수 없는 상황이므로 2-D pointer를 사용할 수 밖에 없었습니다. 그러한 2-D pointer를 이용하기 위해서 malloc을 위와 같은 방식으로 선언한 것이지요 ^^
도움말 감사합니다. ^^
malloc으로 할당하는거하고 new로 할당하는게 시간차이가 있을까?? malloc이 좀 더 빠를꺼라고 막연하게 생각은 하고 있는데 잘 모르겠음…
보고픔 // malloc이야 뭐 C에서 사용하는 거니까요. C++에서 new로 할당하는게 훨씬 편하지 않아요? 음.. 컴파일러만 똑똑하다면야 new로 사용하는게 그닥 느리진 않을 것 같아요.