C++ Pointer 관련 질문인데요
글쓴이: cyrius11 / 작성시간: 화, 2007/01/09 - 3:56오후
(첫 포스팅인데 제대로 안올라가서 다시 씁니다)
Pointer관련인데요. 제 머리로는 이해가 안되네요. 아래 코드에서 swap()함수에 cout문을 한번 쓰느냐 아니냐에 따라 결과가 틀려집니다. 왜 그런지 아시는 분 없나요?
참고로 (a)방식으로 하면 제대로 나오는데 (b)방식으로 하면 안됩니다. 단지 cout문이 있느냐 없느냐의 차이인데요...쩝 T_T
... 생략.....
int main()
{
... 생략 ...
int a, b;
a = 10;
b = 20;
swap(&a, &b);
cout
return 0;
}
void swap(int* a, int* b)
{
//방식 (1)
int* c;
*c = *a;
*a = *b;
*b = *c;
cout
//방식 (2)
int* c;
*c = *a;
*a = *b;
*b = *c;
}
Forums:
우선 int* c의 할당이
우선 int* c의 할당이 안 이루어졌군요. 세그폴트는 안 나나요?
int *c를 int c로 모두
int *c를 int c로 모두 바꾸고 해봤더니 두가지 모두 잘되는군요.. 당연한거지만.
안되는 이유는 모르겠습니다.
안되는건 어떻게 안되는건가요? (-> 질문 하실땐 항상 요것이 핵심입니다.^^)
c에 들어있는 쓰레기값 때문입니다.
c를 생성하면 처음에 당연히 쓰레기값이 들어있습니다. 그 쓰레기값이 가리키는 주소에다가 값을 넣을려고 해서 정의되지 않는 동작이 발생합니다. 예를 들면 우연히 c안에 들어있는 쓰레기값이 커널영역 주소라서 커널영역에다가 값을 쓸려고하면 뻗어버리겠죠.
Just do it!
포인터 보단 레퍼런스로...
꼭 포인터를 쓰실필요가 없다면 레퍼런스로 대체하시는게 이런 류의 실수를 방지해줍니다.
void swap(int& a, int& b)
{
int c;
c = a;
a = b;
b = c;
}
재밌는 방법
갑자기 재밌는 스왑 방법이 기억이 나서 적어봅니다.
int a와 b를 스왑할땐 c가 필요없습니다.
a += b;
b = a - b;
a -= b;
http://kldp.org/node/75518
http://kldp.org/node/75518
허허.
"망치없이 못질"이라....
제가 a + b > MAX_INT 상황에선 쓰지 못한다는 제약을 깜박했군요.
죄송합니다.
포인터만 할당이 된 것이고...
포인터만 할당이 된 것이고 그 포인터가 가리키는 곳의 메모리가 할당되지 않았기 때문에 문제가 있는 코드입니다. 당연하지만 다음과 같이 해야 합니다.
그럴 리는 없겠지만 꼭 int* c로 해야 한다면
이것처럼 할당을 하고 다시 제거하는 바보같은 짓도 할 수 있겠습니다.
이제는 서명에 무엇을 써야하는지 생각해보자.
블로그: http://turtleforward.blogspot.com
답변 주신 고수님들~감사합니다.
감솨합다~~~
꾸벅!
댓글 달기