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
[54883] Re:[질문]return 데이터가 사라집니다. ㅠㅠ
장성호 [nasilso] 1093 읽음    2008-10-14 19:43
좀 헷갈리신것 같네요

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 데이터가 사라집니다. ㅠㅠ 빨간눈 1197 2008/10/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.