본문 바로가기

Programming/Windows Visual C++

함수에서 문자열을 리턴하는 올바른 방법

  • 문제는 아래와 같은 함수는 return 시 지역변수의 메모리가 날아가버리기 때문에 리턴한걸 받아다가 쓰려고 해도 문제가 생기거나 나중에 문제가 생긴다는 것이다. 가끔 myHomeDir이 찍히기도 하지만 대부분 잘 안찍히거나 나중에 잘 안찍힌다.
    char* GetHomeDir()
    {
    char szHomeDir[1024] = "C:\Temp\Myhome";
    return szHomeDir;
    }
    

void main()
{
char* myHomeDir = GetHomeDir();
printf("MyHomeDir: %s\n", myHomeDir);
}

- 가장 올바른 C 방법은 char* 리턴형을 사용하지 않고 변수에 메모리를 할당 한 다음 함수 파라미터로 입력받을 값의 포인터와 사이즈를 넣어주는 것이다.
```C
void GetHomeDir(char* pHomeDir, int size)
{
  strncpy(pHomeDir, "C:\\Home\\Temp", size);
  return;
}
void main()
{
  char szHomeDir[1024] = {0};
  getHomeDir(szHomeDir, _countof(szHomeDir));
  printf("HomeDir:%s\n", szHomeDir);  
}
  • MFC라이브러리를 사용하는 경우 CString을 사용할 수 있는데, 이건 메모리 중도 소멸 문제를 신경쓰지 않고 사용할 수 있다. 왜냐하면 CString객체가 내부적으로 new연산자를 사용하여 문자열에 필요한 메모리를 힙에 할당하기 때문이다. 중도에 소멸되는 문제가 없고 객체가 소멸할 때 할당된 메모리를 알아서 해제하기 때문에 Java의 string처럼 사용하기 용이하다.
    CString GetHomeDir()
    {
    CString str = "C:\home";
    return str;
    }
    void main()
    {
    CString HomeDir = GetHomeDir();
    printf("HomeDir:%s\n", HomeDir.c_str());
    }