ljs921026   6년 전

두 코드의 차이점을 정확히 파악하기 어려워 질문 올립니다.

위 코드에서는 4가 출력되는데,

아래 코드에서는 쓰레기값이 출력됩니다.

이중포인터를 넘겼는데 *를 하나만 붙여도 왜 값이 저장이되는건가요?

yukariko   6년 전

C에서는 call by reference라는 개념이 없기 때문에

포인터를 사용하더라도 값복사가 이루어집니다.

쉽게 말해서 Createvalue에 인자로 받은 i (이하 Ci)와 main안에 선언한 i (이하 Mi)는 다른 메모리 영역을 가지고 있는 서로 다른 변수입니다.

다만 Ci 값으로 Mi의 주소를 저장하고 있는 상태입니다.

거기서 Ci에 새롭게 동적할당 하게 되면, 저장하고있던 Mi의 주소가 날라가고 새로운 주소가 Ci에 값으로 저장됩니다.


두번째 코드의 경우 Ci에는 Mi와 상관없는 주소가 들어갑니다.

따라서 결과적으로 Mi는 쓰래기값을 가지게 됩니다.


첫번째 코드의 경우도 마찬가지로 Ci에는 Mi의 주소가 값으로 저장되어 있습니다.

차이점은 두번째 코드와는 다르게 Ci에서 포인터 접근을 한 상태에서 동적할당을 해 줍니다.

그렇게되면 Ci가 가진 값에 해당하는 주소(Mi)에 동적할당을 한 주소를 넣어주게 됩니다.

즉, Mi에 동적할당한 주소가 들어가는 것이죠.

그러나 그 다음 코드에 *i = 4를 하게 되는데, 이로인해 동적할당한 주소는 변수를 가지지 못한채 날아가고 4가 새롭게 들어가게 됩니다.

그런데 4는 int형이고 Mi는 int *형 이기 때문에 바람직한 코드가 아닙니다.

제 생각에 가장 바람직한 코드는 두번째 코드에서 동적할당한 부분만 제거하면 될것 같습니다.

그리고 포인터에 대해 좀 더 공부해보시는것을 추천드립니다.

https://www.acmicpc.net/blog/v...

제가 정리한 문서도 한번 참고해보시면 좋을것 같습니다.

댓글을 작성하려면 로그인해야 합니다.