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
[59461] 답변감사합니다^^
임형섭 [] 993 읽음    2009-12-16 08:26
결국 저장되는 곳이 다르기 때문이군요. 답변감사합니다.
방콕폐인 님이 쓰신 글 :
: 첫번째 소스는 저장공간을 로컬에 만들어 놓고 그 저장 공간에 123이라는 문자열을 저장하라고 한것이고,
: 두번째 소스는 저장은 컴파일러 알아서 하고 그 시작 번지를 이 포인터 변수에 넣어라 라고 한 것입니다.
:
: 동작이 된다는 두번째 소스의 그 문자열 시작주소를 확인 해 보세요.
: 현재 베이스 스택포인터(ESP) 대비 어디에 저장 되는지.
: 현재 스택 안쪽인지 아닌지. 아니면 다른 곳인지.
:
: 아마 다른곳일 겁니다.
:
: 첫번째 소스에서는 그 문자열의 시작 번지가 당연히 스택 안쪽이겠죠.
:
: 그리고 아까 그 소스에서처럼 콘트롤의 변수를 그대로 계속 사용하면 안됩니다.
: String str = Edit1->Text;
: 처럼 반드시 받아 와서 사용하세요.
:
:
: 임형섭 님이 쓰신 글 :
: : 김시환님, 장성호님, 방콕폐인님, 라스코니님 답변 달아주셔서 진심으로 감사합니다.(__)
: : 정말 포인터의 길은 멀고도 험하군요. 앞에 답변을 보고 더 많이 이해 하려고 노력하겠습니다.(실력이 미천해서...)
: : 이건 좀 다른 질문일수도 있는데 아래 두 소스의 답이 왜 다르게 나오는지 궁금합니다. 결국 pointer와 array의 차이일듯한데... 그 차이를 모르겠네요.
: : &s[0] = 0x11; s[0] = 1; 배열의 시작 주소가 0x11 이라고 가정했을때,  그 주소안에 있는 값은 1 이다.
: : &s[1] = 0x12; s[1] = 2;
: : &s[2] = 0x13; s[2] = 3;
: : &s[3] = 0x14; s[3] = '\0';
: : ...
: : &s[9] = 0x20; s[9] = '\0';
: : ( 주소는 자료형의 크기만큼 증가하지만 편의상 값을 주었습니다.)
: :
: : "123"; 이 저장된 주소시작값이 &0xab라면
: : s = &0xab; *s = 1; *(s+1) = 2; *(s+2) = 3; *(s+3) = '\0'  이라고 생각을 했습니다.
: :
: : 다시 말해서 아래 첫번째 소스 같은 경우 라스코님이 말씀하신대로 s[10]이 지역변수 이기 때문에 함수가 호출된후
: : 리턴되었을때, 값이 날라가서 화면에 찍었을때, 쓰레기 값이 나오는것으로 이해했습니다.
: :
: : 그런데 2번째 소스를 보시면 *s = "123"과 같이 했을 경우에는 올바른 값인 "123" 이 나옵니다.
: : 왜 그런걸까요?
: :
: :
: : 참고로 볼랜드 c++ 2010을 쓰고 있으면 콘솔프로젝트 입니다.
: :
: :
: : #pragma hdrstop
: : #include <tchar.h>
: : #include <stdio.h>
: : #pragma argsused
: :
: : char* returnPChar()
: : {
: :     char s[10] = "123";
: :     return s;
: : }
: :
: : int _tmain(int argc, _TCHAR* argv[])
: : {
: :     char* temp = returnPChar();
: :     printf("%s", temp);
: :     getchar();
: :     return 0;
: : }
: : //---------------------------------------------------------------------------
: : #pragma hdrstop
: : #include <tchar.h>
: : #include <stdio.h>
: : #pragma argsused
: :
: : char* returnPChar()
: : {
: :     char *s = "123";
: :     return s;
: : }
: :
: : int _tmain(int argc, _TCHAR* argv[])
: : {
: :     char* temp = returnPChar();
: :     printf("%s", temp);
: :     getchar();
: :     return 0;
: : }
: :
: : 사족:
: : 답을 줬는데 이자식은 왜 못 알아듣고 계속 지x야 라고 하지 마시고^^;;; 도와주세요(__)
: :
: :
: : 라스코니 님이 쓰신 글 :
: : : B() 함수에서 char *b 변수는 stack에 저장됩니다.
: : : 그래서 return b를 한 후 B() 함수의 모든 지역 변수(local variable)는 저장공간을 잃어버립니다.
: : : 왜냐하면 이들 지역 변수는 stack에 저장되는데 함수 리턴이 된 후  이 공간은 다른 함수의 호출을 위해 활용되기 때문입니다.
: : :
: : : 변수의 값(또는 저장공간)을 계속 유지하기 위해서는 global variable, static variable, const 타입으로 선언할 필요가 있습니다.
: : :
: : : 임형섭 님이 쓰신 글 :
: : : : 답변 감사 드립니다.^^
: : : :
: : : : 제가 질문을 잘 못 올렸네요.
: : : : 제가 묻고 싶었던것은 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의 값이 유지 되는 시점을 알고 싶습니다.

+ -

관련 글 리스트
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                         답변감사합니다^^ 임형섭 993 2009/12/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.