|
방콕폐인님 말이 맞습니다.
char s[10] ="123"; -- (1)
char *s = "123"; -- (2)
은 다른 선언입니다.
(1)은 로컬 variable 영역 즉 스택에 char 10개 만큼 공간을 만든 후 그 영역을 "123" 으로 초기화를 합니다. 그래서 return s; 하면 stack의 주소를 돌려주기 때문에 함수가 종료됨과 동시에 받는 쪽에서 쓸모없는 공간을 가르키게 됩니다.
(2)는 상수 문자열로서 특정영역(아마 BSS 또는 DATA 영역)에 "123"을 저장한 후 그 주소를 s에 대입합니다. 그래서 return s;하면 stack 주소가 아닌 프로그램 실행내내 유효한 상수 문자열 "123"이 보관된 주소를 돌려주는 것이기 때문에 정상적으로 나오는 겁니다.
임형섭 님이 쓰신 글 :
: 김시환님, 장성호님, 방콕폐인님, 라스코니님 답변 달아주셔서 진심으로 감사합니다.(__)
: 정말 포인터의 길은 멀고도 험하군요. 앞에 답변을 보고 더 많이 이해 하려고 노력하겠습니다.(실력이 미천해서...)
: 이건 좀 다른 질문일수도 있는데 아래 두 소스의 답이 왜 다르게 나오는지 궁금합니다. 결국 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야 라고 하지 마시고^^;;; 도와주세요(__)
:
:
:
|