nowmarine   1년 전

혹시 다음 소스코드와 같은 경우는 작동을 안하나요?  11번째 줄이 작동이 되는지 궁금합니다. (지금 비주얼 스튜디오 작동이 안 되는 상황이라 죄송하지만 질문 글 남깁니다.ㅠㅠ...)

wak8835   1년 전

일부 오타를 정정하고, 예시를 추가하였습니다. 차근차근 읽어보시면서 이해하시면 좋을 것 같습니다.

<코드 출력 결과>
num2.age : 20
num2.name : 김영희
0x7fff6691fcd0, 0x7fff6691fcf0 서로 다른 주소를 가지고 있습니다!

nowmarine   1년 전

안녕하세요! 좋은 예시와 함께 다른 문제도 지적해주셔서 감사합니다.

정말 죄송하지만... 한번만 더 부가적인 설명을 여쭙을 수 있을지 싶어 다시 댓글을 작성합니다. ㅜㅜ

num1와 num2의 name에 대한 주소가 다르다는 것은, "김영희"가 num1에 들어가지 않았다는 뜻일까요? 아니면 주소는 다르더라도, num1에는 다른 주소에 잡혀 있는 "김영희"가 들어가 있는 상황인가요? 그리고 이에 따라 num1의 age와 qqq에도 num2에 초기화 값이었던 10과 11이 들어가 있을까요?

찬찬히 혼자 생각하면서 이해할 수 있도록 도와주신 것 같은데 잘 이해하지 못해 죄송합니다... ㅠㅠ

wak8835   1년 전

구조가 동일한 구조체들의 경우의 할당(assign) 연산의 경우에는 메모리 복사(memcpy)와 동일한 수준의 작업을 진행하게 됩니다.

(실제로 컴파일러가 작성하게 되는 코드들도 단순 자료형에 비해 더 많은 mov 어셈블리 라인으로 동작하게 됩니다)


여기서 작성자의 질문 내용을 보면 "김영희"라는 값은 대입이 진행되고 num1.name 과 num2.name에 동일하게 "김영희"가 들어갈 것입니다. 

(다만 값이 들어있는 위치, 즉 주소가 다른 것 뿐이겠죠)

단, 이 과정은 흔히 말하는 깊은 복사 (deep copy) 과정이 이루어지지 않기에 구조체 내의 포인터 변수가 존재하는 경우

그 포인터 변수가 가지고 있는 주소값만을 복사하는 것이므로 주의가 필요합니다. 아래와 같은 예가 주의해야할 상황 입니다.

struct S {
   char * p;
};

struct S s1, s2;
s1.p = malloc(100);
s2 = s1; // s2 또한 s1의 p 포인터가 가지고 있는 주소값을 가져올 것이기 때문에, 같은 값을 가리킨다. (얇은 복사) 

nowmarine   1년 전

이해가 됐습니다! 이해할 수 있도록 도와주셔서 정말 감사합니다... ㅠㅠ  깊은 복사와 얇은 복사에 대해서 별로 생각하고 있지 않았는데 제대로 이해하게 된 것 같아요. 친절하게 차근차근 이해하도록 도와주셔서 정말... 감사합니다 ㅠㅠ 좋은 하루 보내세요!

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