안녕하세요 stack을 c언어로 구현시 더블포인터사용에대해 질문있습니다.

99rom의 이미지

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할때는 그냥 싱글포인터를 사용하네요..
제가 아직 포인터 개념이 약해서 ㅠㅠ 도움을 주세요 ....ㅠㅠ감사합니다

yukariko의 이미지

이를 이해하시려면 왜 더블포인터로 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변수 자체의 주소(더블 포인터)는 필요가 없고 값(싱글 포인터)만 있으면 된다는 의미지요.

따라서 함수안의 인자에 값만 제대로 들어있다면 문제없이 해제가 되는것 입니다.

99rom의 이미지

자세한설명 감사합니다!!!
바로 이해됐어요 ㅠㅠㅠ 답답함이 뻥 뚫렸습니다 감사합니다!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.