C | 변수의 할당 위치 (동적할당)
C언어 거의 하지도 않는데 조교 업무 때문에 C언어를 계속 보고 검색하다 보니까 확실히 파이썬과는 다른 재미가 있는 것 같다ㅎㅎ 새내기 때 지금 교수님 같은 분한테 수업을 들었다면 C언어를 지금보다 조금 더 잘하지 않을까 싶은 생각이 들 정도로 교수님도 열정적이시고 그 만큼 학생분들의 질문도 어렵다......ㅎㅎ
char *getPI(void){
char PI[20];
strcpy(PI, "3.141592653589");
return PI;
}
int main(void){
char *pistr;
pistr = getPI();
printf("%s\n", pistr);
return 0;
}
짠! 위의 코드에서는 어떤 문제가 있을까? 위의 코드르 실행해보면 쓰레기값이 출력될 것이다. 왜 그럴까? 바로 [code]getPI[/code] 함수 내에서 선언된 지역변수 [code]PI[/code] 때문이다. 지역변수는 일반적으로 메모리의 stack 영역에 생기는데 얘네의 특징은, 함수가 호출되면 메모리가 할당되었다가, 함수가 return을 하며 종료되면 메모리에서 내려오게 된다는 것이다.
그래서 [code]main[/code]함수에서 [code]pistr = getPI();[/code] 라인이 실행되면, getPI내에서 PI라는 변수가 stack영역에 올라갔다가 내려가게 되는데 pistr은 포인터로 계속 그 주소를 가리키게된다. 하지만, 이미 그 주소에 있던 변수는 getPI 함수가 종료되면서 메모리에서 내려가게 되기 때문에 pistr을 출력해보면 쓰레기값이 나오게된다.
그렇다면 어떻게 이걸 수정할 수 있을까? 바로 malloc을 사용하는 것이다. C언어에서는 malloc을 이용해서 동적할당을 할 수 있는데 이는 heap 영역에 할당된다. 이의 특징은 가비지 컬렉터가 없는 한 직접 관리를 해줘야 한다는 점이다. 쨋든, 메모리를 동적으로 heap 영역에 할당하면, 내가 원하는 만큼 쓰다가 더 이상 필요 없을 때 그 때 해제해주면 된다!
아래처럼 바꾸면 정상적으로 출력이 된다!
char* getPI(void) {
//char PI[20];
char* PI = (char*)malloc(sizeof(char) * 20);
strcpy(PI, "3.141592653589");
return PI;
}
int main(void) {
char* pistr;
pistr = getPI();
printf("%s\n", pistr);
return 0;
}