포인터를 좀 잘못사용하셨네요 ;;
지금 결과가 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'이 출력되죠?
|