|
김시환님, 장성호님, 방콕폐인님, 라스코니님 답변 달아주셔서 진심으로 감사합니다.(__)
정말 포인터의 길은 멀고도 험하군요. 앞에 답변을 보고 더 많이 이해 하려고 노력하겠습니다.(실력이 미천해서...)
이건 좀 다른 질문일수도 있는데 아래 두 소스의 답이 왜 다르게 나오는지 궁금합니다. 결국 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의 값이 유지 되는 시점을 알고 싶습니다.
|