좀 헷갈리신것 같네요
c,c++에서 지역변수는 블럭 { } 안에서만 생존합니다.
블럭{}을 벗어나면 사라지죠
void __fastcall TMainForm::Button8Click(TObject *Sender)
{
char *cPVer;
char dest[20];
cPVer=VersionData(&cdata[7], dest);
Memo2->Lines->Add(cPVer);======================> 비정상
Memo2->Lines->Add(dest);========================>정상
}
char * __fastcall TMainForm::VersionData(char *cdata, char *dest)
{
char cVer[20]={0,};
memset(cVer,0,20);
sprintf(cVer,"%c%c%c%c\n",cdata[0],cdata[1],cdata[2],cdata[3]);
memcpy(dest, cVer, sizeof(cVer));
return cVer;
}
Button8Click에서
1. cPVar (1Byte) 와 dest (20 Byte) 가 스택에 생성됩니다.
2. 그다음 VersionData 를 호출하죠
3. TMainForm::VersionData 메소드에서는
char *cdata, char *dest 가 생성되고
char cVer[20]={0,}; 가 스택에 생성됩니다.
4. 작업을 하고..
5. VersionData 메소드를 벗어날때
먼저 cVar가 스택에서 삭제되고
그다음 *cdata 와 *dest 가 삭제되겠죠
VersionData 의 char*data는 Button8Click의 data를 가리키고 있는 포인터 변수입니다.
6. 이제 다시 Button8Click 메소드로 돌아와서
Memo2->Lines->Add(cPVer); // 이 작업을 하려고 할것입니다.
여깃 cPVer 이라는 포인터 변수는 분명 존재 합니다만
cPVer 이 가리키고 있는 VersionData 메소드의 cVer 입니다.
그런데 이는 이미 앞에 5과정에서 사라졌습니다.
그러니 cPVer 가 가리키고 있는 곳에서 무엇인가를 copy하려니 문제가 발생하는것이죠
7. 마지막으로 Button8Click 메소드에서 return될때도
dest[20] 가 스택에서 삭제될것이구, 그다음 cPVer 이 삭제되구
그다음 Sender가 삭제될것입니다.
결론적으로 cVer이라는 char 배열은
TMainForm::VersionData 이라는 메소드가 호출되어 종료되기 전까지만 의미가 있습니다.
함수가 종료하고 난뒤에 함수안에서 선언햇던 변수에 접근하려면 문제가 발생하는것은 당연하죠
만약 함수를 벗어나서도 의미를 가지려면
스택이 아닌 힙에 생성해야 합니다.
힙에 생성하려면 new, malloc 등의 함수를 이용해야 되겠죠
new나 malloc으로 생성한 메모리는 delete나 free를 하기전까지는 계속 존재하죠
위의경우는 그냥 TMainForm::VersionData 메소드는 그냥 bool형으로 제대로 copy되었는지안되었는지
뭐 그런정보를 return하도록 하는것이 좋을듯 합니다.
그럼..
빨간눈 님이 쓰신 글 :
: 버튼 8이벤트를 눌러서 VersionData 멤버함수를 처리하는 과정에서
: return 값 하고 dest 값을 잘 나오는거 확인했습니다.
: 이후 단지 메모장에 뿌를때 cPVer은 깨지고 , dest는 정상으로 나옵니다. 확인부탁드립니다.. 꾸벅
:
: char * __fastcall TMainForm::VersionData(char *cdata, char *dest)
: {
: char cVer[20]={0,};
: memset(cVer,0,20);
: sprintf(cVer,"%c%c%c%c\n",cdata[0],cdata[1],cdata[2],cdata[3]);
: memcpy(dest, cVer, sizeof(cVer));
: return cVer;
: }
:
:
: void __fastcall TMainForm::Button8Click(TObject *Sender)
: {
: char *cPVer;
: char dest[20];
:
: cPVer=VersionData(&cdata[7], dest);
:
: Memo2->Lines->Add(cPVer);======================> 비정상
: Memo2->Lines->Add(dest);========================>정상
: }
:
: 저게 왜 비정상으로 나오는지 이해가 잘 않갑니다.. ㅠㅠ