장성호님 감사합니다. 제가 착각을 한것이군여~
: Memo2->Lines->Add(cPVer);======================> 비정상
: Memo2->Lines->Add(dest);========================>정상
에서 cPVer data까지 퀵와치 디버그에 값은 계속적으로 살아있었습니다.
단지 메모장에 쓰여질때 쓰레기가 나와서 한참 고민했네 ㅠㅠ 엉엉~
그러면 char * 의 return값을 꼭 사용하고 싶을때 "char cVer[20]={0,}; " 이것 만
힙에 할당하면 되는거죠?
장성호 님이 쓰신 글 :
: 좀 헷갈리신것 같네요
:
: 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);========================>정상
: : }
: :
: : 저게 왜 비정상으로 나오는지 이해가 잘 않갑니다.. ㅠㅠ