#dokydoky

이차 배열 동적할당 하다가 코딩 실수 본문

Programming

이차 배열 동적할당 하다가 코딩 실수

dokydoky 2011. 8. 6. 01:15

내 경험..

얼마 전, 프로그래밍을 하다가 오류가 발생했다.

아무리 봐도 오류날 이유가 없었는데, 하나하나 디버깅 해봐도 도저히 모르겠음.

그러다가 free() 함수를 주석처리 해보니 오류가 안나는 거다.. 당시 문제있던 코드를 재현해보면


#include <stdio.h>

#include <stdlib.h>


int main()

{

int i;

int m, n;

char** dp;


printf("m, n 입력 : ");

scanf("%d %d", &m, &n);


dp = (char**)malloc( sizeof(char) * n );

if( dp == NULL )

{

printf("dp 메모리할당 실패 \n");

return 1;

}


for(i=0; i<n; i++)

{

dp[i] = (char*)malloc( sizeof(char) * m );

if( dp[i] == NULL )

{

printf("dp[i] 메모리할당 실패 \n");

return 2;

}

}



for(i=0; i<n; i++)

{

free(dp[i]);

}


//free(dp); 주석하면 에러X, 주석풀면 에러


return 0;

}


그래서 주석하고 계속 코딩하면서 테스트해보니까 컴퓨터가 점점점 느려진다...-_- (메모리 해제를 안해서겟지?)

"혹시 더블포인터로 동적할당을 받으면 free()함수가 아닌 다른 함수로 해제 해야 하는건가?" 라는 생각도 해봤는데

그건 아닌것 같구.. 결국 코딩을 첨부터 다시 해보면서 아!!!! ㅋㅋ 한참을 해매다가 드뎌 발견.

char** dp = (char**)malloc( sizeof(char) * n );  (x)

char** dp = (char**)malloc( sizeof(char*) * n ); (o)


sizeof(char) 는 1바이트, sizeof(char*)는 4바이트다.(포인터는 항상 4byte임)

전자는 dp가 1 * n byte를 할당받은 메모리를 가리키고

후자는 dp가 4 * n byte를 할당받은 메모리를 가리킨다.

미스테리한건 1byte n개의 배열이 또 동적할당된 메모리를 가리키는데

결과는 다 잘나오구 free함수에서만 오류났다는 것이다... 


free()함수를 실행했을 때 오류가 난 이유는 동적 배열 할당을 해제할 때,

첫 원소를 해제한 후, 다음 원소를 해제할 때 4byte씩 더한주소를 해제 하기때문에 에러발생

사소한 실수라고 하기엔 너무 심각한 문제를 일으키는 실수였다. 항상 코딩할 때, 예외상황을 생각하며 주의해야겠다.


Comments