quf9484   5년 전

포인터를 모르는 저를 도와주세요ㅜㅜ

39번째 줄을 출력하면 세그멘테이션 폴트가 나옵니다.

그리고 15번째 줄에 value stored to 'dptr' is never read 라고 나오는데 왜 read 되지 않는 것도 궁금합니다.

chogahui05   5년 전

으으.. 뭔가 잘못 이해하고 계신 거 같은데.

dptr이라고 하면 2중 포인터잖아요? 그렇다면 일단

[dptr] --> [somewhere] --> [original_data]

물론 초기값은 NULL이므로 실제로는

[dptr] --> nil

이렇게 그림이 그려질 거 같군요.

이 dptr 값을 넘겨줄 건데..

CreateFront(struct _Deque **dptr,...) 라는 걸 보면

Deque *new = malloc(...) 라는 구문이 나와요.

그리고 dptr = &new; 이라는 게 나오는데.. 뭔가 헷갈리신 거 같은데 이 경우, 함수 내부에서는 어떻게 그려지냐면..

[dptr] --> nil

[dptr] --> [&new] --> [new] --> [original_data]

이렇게 그려질 거에요. 그런데 create 호출이 끝나고 나면 다시 어케 되냐면..

[dptr] --> nil

요래 되겠죠.. 뭔가 헷갈리신 거 같네요.

chogahui05   5년 전

실제로 저런 식으로 하시려는 경우. main에서는

Deque *deq; 로 선언만 해 두시고

넘기실 때 create_front(&deq,...) 이래 한 다음에 Callee? 쪽에서


create_front(Deque **target,...)

{

    *target = (deque*)malloc(sizeof(deque)); //target이 가르키고 있는 data를 새로 할당한 주솟값으로 대입시켜 버린다.

    //[deq의 주소값] -> [deq] -> [실제 original deq]기 때문에..

}

이런 식으로 하시는 게 맞아보입니다.

quf9484   5년 전

먼저 답변감사합니다.

아직 해결되지 않은 궁금증이 있어서 이렇게 글을 남깁니다.

call by value 와 call by reference의 차이는 알고 있습니다.

그런데 creat_front(strcut Deque *dptr)으로 구현 했을 때

main 에서 creat_front(&dptr)이 아니라 creat_front(dptr)을 해도 call by reference가 되는 것이 아닌가요?

그리고

==================================

[dptr] --> nil

[dptr] --> [&new] --> [new] --> [original_data]

이렇게 그려질 거에요. 그런데 create 호출이 끝나고 나면 다시 어케 되냐면..

[dptr] --> nil 

=================================

라고 답변을 주셨는데 함수에서 포인터를 할당하고 할당해제를 하지 않았는데

왜 마지막 줄 처럼 dptr이 nil을 가르키게 되는지 궁금합니다.




chogahui05   5년 전

2중 포인터 변수던, 3중 포인터 변수던 c언어에서는 call by value이기 때문에입니다.

포인터 변수를 가리킨다고 생각하시지 마시고, 하나의 변수라고 생각하시면 이해가 빠를 듯 싶습니다.

quf9484   5년 전

감사합니다!!

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