안녕하세요 stack을 c언어로 구현시 더블포인터사용에대해 질문있습니다.
글쓴이: 99rom / 작성시간: 월, 2014/08/04 - 5:54오후
typedef struct tagnode{ int data; }Node; typedef struct tagstack{ int Capacity;//최대값 int Top; Node* Nodes; }ArrayStack; void Createstack(ArrayStack **stack,int capacity){ //스택을 자유 저장소에 생성합니다. (*stack)=(ArrayStack*)malloc(sizeof(ArrayStack)); //입력된 capacity만큼의 노드를 자유저장소에 생성 (*stack)->Nodes =(Node*)malloc(sizeof(Node*capacity)); //capacity,Top 초기화 (*stack)->capacity = capacity; (*stack)->Top=0; } void Destroy(ArrayStack *Stack){ //동적할당 된 노드를 해제 free(Stack->Nodes); free(Stack); } int main(){ ArrayStack *stack=NULL; CreateStack(&stack,10); 생략 }
스택을 구현하는 코드인데요 !
create할때 파라미터를 더블포인터를 사용하는 이유는 헷갈리지만서도 조금은 알겠는데..
free를 이용해 동적할당된 노드를 해제할때는
왜 파라메타를 싱글포인터로 받는지 이해가 안됩니다 ㅠㅠ
제생각은 싱글포인터로 받으면 안되고 더블포인터로 받아야된다 생각하거든요...
create할때는 싱글포인터로 받으면 그 함수내에서만 생성되고 함수종료시 소멸된다 생각했는데, destroy할때는 그냥 싱글포인터를 사용하네요..
제가 아직 포인터 개념이 약해서 ㅠㅠ 도움을 주세요 ....ㅠㅠ감사합니다
Forums:
곰곰히 생각해보시면 간단한 문제입니다.
이를 이해하시려면 왜 더블포인터로 Create를 하는지 이해하셔야 할 탠데,
CreateStack을 해줄 때, 더블포인터를 사용하지 않고 그냥 적어준다고 가정합시다.
ArrayStack *stack=NULL;
CreateStack(stack,10);
void Createstack(ArrayStack *stack,int capacity){
stack=(ArrayStack*)malloc(sizeof(ArrayStack));
}
이렇게 사용하게 되겠죠. 이렇게 되면 인자로 받아온 stack의 값은 의미가 없어져 버립니다.
왜냐하면 저 함수안에 있는 stack은 지역변수이기 때문이지요.
지역변수에 동적할당한 주소를 넣어줘 봤자 함수가 종료되는순간 사라지기 때문에 의미가 없습니다.
그렇다고 해서
(*stack)=(ArrayStack*)malloc(sizeof(ArrayStack));
와 같이 처리해버리면 *stack은 포인터가 아닌 그저 ArrayStack 형일 뿐이므로 포인터형식을 지원하지 않습니다.
따라서 동적할당을 함수안에서 해줘야 한다면, 그 주소를 저장할 변수의 주소가 필요해지는 것입니다.
한마디로 포인터형 변수의 포인터, 즉 더블 포인터가 필요한 것이지요.
그렇다면 왜 해제할 때는 싱글포인터냐 하면,
stack변수는 주소를 담고있고, 그 주소는 스택이 생성된 주소를 의미합니다.
우리가 해제하고 싶은 것은 stack변수가아닌, stack변수가 가리키는 값, 즉 스택이 생성된 주소입니다.
이 말은 stack변수 자체의 주소(더블 포인터)는 필요가 없고 값(싱글 포인터)만 있으면 된다는 의미지요.
따라서 함수안의 인자에 값만 제대로 들어있다면 문제없이 해제가 되는것 입니다.
감사합니다!!!!!
자세한설명 감사합니다!!!
바로 이해됐어요 ㅠㅠㅠ 답답함이 뻥 뚫렸습니다 감사합니다!!!
댓글 달기