- 문제는 아래와 같은 함수는 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()); }
'Programming > Windows Visual C++' 카테고리의 다른 글
/MT /MD 옵션의 차이 (0) | 2020.03.16 |
---|---|
.lib와 .dll의 차이 (0) | 2020.03.16 |
윈도우 서비란 무엇인가? 서비스 만들기 (0) | 2020.03.16 |
.h파일 include하는 올바른 방법 (0) | 2020.03.16 |
Rabbitmq-c 와 CURL 라이브러리 사용법 (0) | 2020.03.16 |