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
[59448] Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정)
방콕폐인 [jeong325] 1253 읽음    2009-12-15 14:02
이 문제는 제가 보기에 콘트롤에 있는 Text를 바로 사용해서 발생하는 문제로 보입니다.
Edit1->Text 같은 변수는 단순히 콘트롤의 값을 가져올때와 콘트롤에 업데이트 할때만 사용하는게 좋습니다.

예를들면,
char* string = Edit1->Text.c_str();
이런 형식으로 바로 사용하셨는데 이건 안좋은 습관입니다.

String str = Edit1->Text.c_str();
char* string = str.c_str();
이렇게 다른 변수에 담아 오셔서 사용하는게 좋습니다.




임형섭 님이 쓰신 글 :
: 답변 감사 드립니다.^^
:
: 제가 질문을 잘 못 올렸네요.
: 제가 묻고 싶었던것은 Edit->Text.c_str()을 사용하면 포인터값이 넘어오는데 실제로 이 값을 출력하면 원하는 결과가 아닌 쓰레기 값이 나오기 때문에 .(다시 말하면 아래 원문의 소스 결과 값이 원하는 결과가 안나오고 이상하게 나온다는거죠) strcpy(string, Edit1->Text.c_str())을  사용하면 원하는 결과가 나옵니다. 그 이유를 생각컨데 Edit->Text.c_str()에서 값을 반환하면 함수가 끝나기 때문에 변수생명주기(맞는용어인가요?)에 따라서 값이 사라지기 때문이라고 생각했습니다.
: 그런데 strcpy(string, Edit1->Text.c_str);에서 정확한 값이 저장되는 것을 보면 함수가 호출된후에 리턴되었을시 함수가 저장된 메모리가 없어지는 것이 아니라 리턴후 다음 문장이 처리된 다음 없어지는 건가요?
:
: void A(){
:    char* a = B();
: }
: char* B(){
:    char* b="aaa";
:    return b;
: }
: 이런식일때 b의 값이 유지 되는 시점을 알고 싶습니다.
:
:
: 김시환 님이 쓰신 글 :
: : char string[20];
: : strcpy(string, Edit1->Text.c_str);
: : 이 문장은 문자열을 다른 메모리 공간에 복사하는 의미가 됩니다.
: : 즉 같은 문장이 2군데의 메모리에 저장되는 것을 의미합니다. 기존의 Edit1->Text  라는 별도의 버퍼와 string[20] 이라는 두개의 별도의 메모리 영역을 가지게 됩니다.
: :
: : char* string = Edit1->Text.c_str();
: : 이 문장은 한개의 메모리 공간을 가지며 대신 그 메모리의 포인터(메모리 주소번지)만 string에 저장되는 것입니다.
: :
: :
: : 첫번째 문장에서 string의 내용을 변경해도 Edit1->Text 의 내용은 변경이 되지 않겠지만, 두번째 문장의 경우 string의
: :
: : 내용을 바꾸면 Edit1->Text의 내용도 변경됩니다. 같은 공간에 내용을 공유하고 있기 때문이죠...
: : (수정) 그런데 지금 막 테스트 해 보니 두번째 문장에서 string을 변경해도 Edit1->Text 의 내용은 변경이 되지 않네요..
: : 이유를 보니까 string의 내용을 변경하면 Edit1->Text 의 메모리 주소가 변경되면서 기존에 있던 문자를 그냥 가지고 갑니다.
: :
: :
: :
: :
: : 임형섭 님이 쓰신 글 :
: : : 아래 소스와 같이 edit에서 글을 입력해서 strtok를 이용해 문자열을 구분하여 출력하는겁니다.
: : : 의문이 나는것은 주석처리 한부분입니다.
: : : 1,2를 한 줄에 쓰면 3과 같다고 생각했습니다. 그런데 결과는 동일하지 않네요
: : : 그 이유를 모르겠습니다.
: : : 간단히  char string[20];
: : :             strcpy(string, Edit1->Text.t_str;
: : : 과
: : :              char* string = Edit1->Text.t_str();
: : : 의 차이점을 모르겠습니다.
: : : 질문도 제대로 못하는 초보였습니다.
: : :
: : : 다시 살펴보니 전에 질문했던 내용과 같은 내용인것 같아서
: : : Edit2->Text.t_str(); 이함수에서 읽은 내용이 지역변수(?)가 되기 때문에 값이 유지가 안되어서 그런걸까요?
: : : 만약 그렇다면 strcpy에서도 올바른 값이 나오지 않아야 하는것 아닌가요?
: : :
: : :
: : : void __fastcall TForm4::Button1Click(TObject *Sender)
: : : {
: : :  char string[20];<------------------------1
: : :  strcpy(string, Edit1->Text.t_str());<---------2
: : :                 //char* string = Edit1->Text.t_str();<--------3
: : :             
: : :  char token[10];
: : :  strcpy(token, Edit2->Text.t_str());
: : :  char* temp;
: : :                 // char* token = Edit2->Text.t_str();
: : :  temp = strtok(string, token);
: : :  Memo1->Lines->Add(temp);
: : :  while(temp != NULL)
: : :  {
: : :
: : :   temp = strtok(NULL, token);
: : :   Memo1->Lines->Add(temp);
: : :  }
: : : }

+ -

관련 글 리스트
59434 배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 임형섭 1408 2009/12/14
59443     Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 김시환 1208 2009/12/15
59446         Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 장성호 1114 2009/12/15
59445         Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 임형섭 1104 2009/12/15
59448             Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 방콕폐인 1253 2009/12/15
59447             Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 라스코니 1217 2009/12/15
59457                 Re:Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 임형섭 1221 2009/12/15
59460                     Re:Re:Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 라스코니 1432 2009/12/15
59458                     Re:Re:Re:Re:Re:배열과 포인터의 차이점(맞는 제목인지도 모르겠네요)-_-;;(수정) 방콕폐인 1108 2009/12/15
59461                         답변감사합니다^^ 임형섭 994 2009/12/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.