마음의 안정을 찾기 위하여 - 데이터를 반환(return)하는 함수 생성시 배열과 포인터의 사용에 관한 고찰(?)
2265259
400
388
관리자새글쓰기
태그위치로그방명록
별일없다의 생각
dawnsea's me2day/2010
색상(RGB)코드 추출기(Color...
Connection Generator/2010
최승호PD, '4대강 거짓말 검...
Green Monkey**/2010
Syng의 생각
syng's me2DAY/2010
천재 작곡가 윤일상이 기획,...
엘븐킹's Digital Factory/2010
데이터를 반환(return)하는 함수 생성시 배열과 포인터의 사용에 관한 고찰(?)
My Library | 2008/08/12 15:24

C 프로그램에서 메모리는 두 가지로 나누어진다.

스택기반 메모리 : 일반 변수 및 배열
HEAP기반 메모리 : malloc를 통해서 할당된 메모리

이 두가지 메모리의 차이는 생명주기에 있는데, HEAP에 기반을 둔 메모리가 명시적인 free 문장만으로 컴퓨터로 반환된다면, 스택에 기반을 둔 메모리는 사용범위에 따라 생명주기가 결정된다.

소스 #1
char *func()
{
    char *tmp;
    tmp = malloc( 100 );
    strcpy( tmp, "kkkk" );
    return tmp;
}
int main(void)
{
    char *tmp;

    tmp = func();

    printf( "tmp = %s\n", tmp );
}


소스 #2
char *func()
{
    char tmp[100];

    strcpy( tmp, "kkkk" );

    return tmp;
}
int main(void)
{
    char *tmp;

    tmp = func();

    printf( "tmp = %s\n", tmp );
}



[소스 #1]에서는 (char *)형을 갖는 tmp 변수는 함수를 벗어나게 되면 소멸됩니다. 하지만 변수 자체만 소멸될 뿐, malloc() 함수를 통해 할당된 영역은 함수를 벗어나도 없어지지 않고 그대로 메모리상에 남아있습니다.
함수를 벗어나면서 소멸되는 것은 그 시작 주소를 담고 있는 tmp 변수 뿐이며, 그 값이 소멸되기 전에 return으로 함수를 호출한 main에 그 주소값을 전달하기 때문에 아무런 문제가 없습니다. 함수를 호출한 호출자는 해당 함수를 통해 전달받은 데이터를 잘 사용한 다음 free()를 호출하여 메모리를 해제하여주면 됩니다.

[소스 #2]에서는 함수를 벗어나자마자 char형 배열 전체가 소멸됩니다. 따라서 tmp를 가리키는 포인터를 리턴하는 것은 아무런 의미가 없습니다. 포인터가 가리키는 대상체가 이미 사라졌기 때문입니다.

굳이 malloc를 이용하지 않고 배열을 사용하고 싶다면, 아래의 예제처럼 struct 형태의 구조체를 이용하여 구조체를 반환하면 됩니다.

struct Sample {
  char string[100];
}

struct Sample func() {
    struct Sample tmp;

    strcpy( tmp, "kkkk" );

    return tmp;
}
int main(void)
{
   struct Sample tmp;

    tmp = func();

    printf( "tmp = %s\n", tmp.string );
}

2008/08/12 15:24 2008/08/12 15:24
Article tag list Go to top
View Comment 1
Trackback URL :: 이 글에는 트랙백을 보낼 수 없습니다
From. 겐도 2008/08/12 17:10
답글달기삭제
static을 사용한 트릭도 재미있을 텐데요 :)
C 기본 함수중에 이런 특성때문에 연속으로 부르지 못하는 것들이 있죠.
PREV : [1] : NEXT
 
 
 
 
PREV : [1][2][3][4][5] ... [32] :
«   2024/03   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
전체 (1317)
출판 준비 (0)
My-Pro... (41)
사는 ... (933)
블로그... (22)
My Lib... (32)
게임 ... (23)
개발관... (3)
Smart ... (1)
Delphi (93)
C Builder (0)
Object... (0)
VC, MF... (10)
Window... (1)
Open API (3)
Visual... (0)
Java, JSP (2)
ASP.NET (0)
PHP (5)
Database (12)
리눅스 (29)
Windows (25)
Device... (1)
Embedded (1)
게임 ... (0)
Web Se... (2)
Web, S... (21)
잡다한... (6)
프로젝트 (0)
Personal (0)
대통령... (13)
Link (2)