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
[29321] Re:Re:Re:다른 분들 아시면 답변좀 부탁 드립니다.
Starlet [starlet5] 1074 읽음    2004-04-09 14:27
안녕하세요. 다음 func() 호출때부터 abc가 zbc로 나오는 이유는 char *str = "abc" 로 정의한데 있습니다.
"abc"라는 문자열로 소스내에 지정하였기때문에 컴파일시 이 "abc" 라는, 이런 종류의 문자열들이 모여있는 데이터 그룹내에 있게됩니다. 이 데이터그룹안에는 printf("Hello!");에서 Hello! 같은 문자열 등이 위치해 있어서 printf 호출 전에 이 데이터그룹 내의 Hello!문자열의 주소를 printf에 넘겨주는 것이지요.
*str = "abc" 에서 이 "abc"도 이 데이터그룹내에 "abc"로 들어가 있으며 *str은 새로 메모리를 할당받아 "abc"를 넣는것이 아닌 데이터 그룹내의 "abc"위치를 가리키고 있게 됩니다. 첫번째 함수 호출에서 zbc로 바꾸게 되면 데이터 그룹내의 "abc"가 zbc로 바뀌게 되며 두번째 호출때는 str이 데이터 그룹내의 "zbc"를 가리키게 되어 zbc로 출력되는 것입니다.
정리하자면 char *str = "abc" 의 의미는 str에 새 주소를 할당한 후 문자열 "abc"로 초기화하는 것이 아니라 컴파일될때 이미 데이터 그룹내에 "abc"를 위치하게 하여, char *str = "abc"라는 코드가 컴파일 될때는 데이터그룹 내의 "abc"를 가리키게 컴파일된다는 것입니다.

첫번째에 질문하신 데이터 영역 침범에 관한 것도 이 "abc"가 데이터 그룹내에 있다는 사실을 알게되면 왜 위험한지 아실것입니다. 데이터 그룹내에는 이렇게 소스 코드내에 지정된 문자열들이 줄줄이 붙어 있습니다. 만약 char *str = "abc"로 정의한후 str에 "abc" 길이 이상의 문자열을 넣게 되면 다른 문자열 위에 덮어씌우게 되며, 만약 다른 문자열의 NULL문자까지 덮어씌우면 이 문자열을 사용하는 함수가 NULL문자를 찾지 못해 Access Violation 이 나오게 될 소지도 있습니다.

Builder MySelf 님이 쓰신 글 :
: : 처음 func()를 호출하면.. Edit1에 abc라고 출력한다음에 str의 문자열의 첫번째 문자를 'z'로 바꾸게 되니깐. 두번째 func()를 호출 하면 zbc라고 나오죠..
: :
: : 이건 배열과 포인터가 같은 주소공간을 가르키고 있다는 설명을 하는겁니다.
: : 다시 말해서 *str 이랑 str[0] 동일한 주소공간을 가르키는 거구요
: : *(str + 1) , str[1] 하고 같고
: : *(str + 2),  str[2] 하고 같다는 말이죠..
: :
: : 다시말하면 str 이란 변수에는 abc문자열의 첫번째 문자 'a'가 저장된 위치의 주소값을 가지고 있는겁니다.
: : str + 1 은 주소값을 1 증가 시키는 결과니깐 'b'문자의 주소값이 되는거죠.
:
: 영준님께서 말씀하신것 중에 이상한 점은
:
: 분명 다음 func()를 콜 하면 다시 변수를 선언 한다는것이죠...
:
: char *str = "abc";
:
: 다시 abc가 되야 맞는 말입니다... 다만 현재 static변수처럼 행동하고 있다는것이 문제 이지요...
:
: 영준님께서 설명하신 포인터 연산하고는 약간 다른 문제가 아닌가요??

+ -

관련 글 리스트
29293 C / Pointer질문... gozealot 1084 2004/04/07
34807     Re:C / Pointer질문... 금목암 1075 2004/04/08
29294     금목암님 질문... Builder MySelf 1023 2004/04/08
29296         Re:금목암님 질문... 금목암 1008 2004/04/08
29298             Re:Re:금목암님 질문... Builder MySelf 1088 2004/04/08
34806                 Re:Re:Re:금목암님 질문... 금목암 987 2004/04/08
29301                 답변 잘 들었습니다. 감사하고요.. Builder MySelf 954 2004/04/08
34805                     Re:답변 잘 들었습니다. 감사하고요.. 금목암 1098 2004/04/08
29302                     금목암님.. 라스트 퀘스쳔이 아닐까.. 생각됩니다. 감사합니다. gozealot 1058 2004/04/08
34804                         Re:금목암님.. 라스트 퀘스쳔이 아닐까.. 생각됩니다. 감사합니다. 금목암 1108 2004/04/08
29306                         다른 분들 아시면 답변좀 부탁 드립니다. gozealot 940 2004/04/08
29310                                 Re:Re:다른 분들 아시면 답변좀 부탁 드립니다. Builder MySelf 890 2004/04/08
34803                                     Re:Re:Re:다른 분들 아시면 답변좀 부탁 드립니다. 강영준 954 2004/04/08
34802                                     Re:Re:Re:다른 분들 아시면 답변좀 부탁 드립니다. Builder MySelf 1013 2004/04/08
34801                                     Re:Re:Re:다른 분들 아시면 답변좀 부탁 드립니다. 강영준 1107 2004/04/08
29321                                     Re:Re:Re:다른 분들 아시면 답변좀 부탁 드립니다. Starlet 1074 2004/04/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.