Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5277] Re:1년 전 공부했던 내용인데 이해가 안되네요. 이럴 수도 있는지?
오전&오후 [kkhhyy11] 1358 읽음    2005-09-05 14:53
포인터를 좀 잘못사용하셨네요 ;;
지금 결과가 201 201 400이 보이는 이유는 운좋게도 data[], moredata[]이 두 배열데이타가
연속된 메모리 공간에 잡혀있기 때문에 운좋게도 결과가 나올수 있었던거 같네요 2개의 배열데이타가
연속되지 않은 공간에 잡혔다면 access violation이 나왔을 겁니다.
우선 p1에 대해서만 말하자면
printf("*p1++ = %d, *++p2 = %d, (*p3)++ = %d\n",
             *p1++, *++p2, (*p3)++);  <--- 이 부분에서 p1의 메모리번지가 증가합니다. int형이니까
4byte증가 하겠죠? 예로 들면 data번지가 1000번지라면 처음에 p1이 1000을 가르키다가 *p1++ 이거로 인해서
p1은 1004번지를 가르키게 됩니다. 즉 *p1의 값은 300이 되겠죠
그리고 다음에  
p1++;
이거를 하셨는데 그럼 p1은 1008번지를 가르키게 됩니다. data가 가르키는 번지는
1000 - 1007번지에 데이타가 들어있는데 p1은 그 메모리범위를 벗어난곳을 가르키게 됩니다. 이거는 당연히
문제가 생기게 됩니다. 그러나 운좋게도 moredata가 1008번지에 잡혀서 결과가 에러없이 출력이 된거죠

예로 data가 1000번지에 moredata가 2000번지에 잡혔다면 어떻게 될런지 생각해 보셨나요??

경선->건강 님이 쓰신 글 :
: 1년 전 공부했던 '배열과 포인터' source를 우연히 봤는데 내용 일부분 중 이해가 안되는 부분이 있어서
: 질문합니다.
:
: #include <stdio.h>
:
: int data[2] = {100, 300};
: int moredata[2] = {200, 400};
:
: void main(void)
: {
:       int *p1, *p2, *p3;
:
:       p1 = p2 = data;
:       p3 = moredata;
:       printf("*p1++ = %d, *++p2 = %d, (*p3)++ = %d\n",
:             *p1++, *++p2, (*p3)++);  <--- 이 부분에서
:       printf("*p1 = %d, *p2 = %d, *p3 = %d\n",
:             *p1, *p2, *p3);
:       p1++;
:       p2++;
:       p3++;
:       printf("%d, %d, %d\n", *p1, *p2, *p3);      // 이해가 안되는 부분
:
:       // (*p1)++은 (*p1)을 출력 후, (*p1)++을 한다.
:       printf("%d\n", (*p1)++);    // *p1++로 바꿔볼 것
:       printf("%d\n", *p1);
: }
:
:
: 이해가 안되는 부분에서 '200, 200, 400'이 출력되야 하는데 왜 '201, 201, 400'이 출력되죠?

+ -

관련 글 리스트
5276 1년 전 공부했던 내용인데 이해가 안되네요. 이럴 수도 있는지? 경선->건강 1499 2005/09/05
5277     Re:1년 전 공부했던 내용인데 이해가 안되네요. 이럴 수도 있는지? 오전&오후 1358 2005/09/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.