C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[54884] Re:Re:[질문]return 데이터가 사라집니다. ㅠㅠ
빨간눈 [] 1196 읽음    2008-10-14 21:01
장성호님 감사합니다. 제가 착각을 한것이군여~
:      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);========================>정상
: : }
: :
: : 저게 왜 비정상으로 나오는지 이해가 잘 않갑니다.. ㅠㅠ

+ -

관련 글 리스트
54881 [질문]return 데이터가 사라집니다. ㅠㅠ 빨간눈 1197 2008/10/14
54883     Re:[질문]return 데이터가 사라집니다. ㅠㅠ 장성호 1093 2008/10/14
54884         Re:Re:[질문]return 데이터가 사라집니다. ㅠㅠ 빨간눈 1196 2008/10/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.