왜 더블포인터를 쓸까요?

litdream의 이미지

예제 코드를 보면, 포인터변수를 지역변수로 선언한후,
그 포인터변수의 주소를 Spawn() 이라는 함수로 넘겨버립니다.
Spawn 함수는 근데, 기껏 더블포인터를 받아놓고는 막상
대입할때는, 역참조를 한번 하고 대입합니다.

어짜피 지역변수면 스택이 사라지면 의미가 없어지는것 아닌가요?
그냥 단순히 일반 포인터를 넘기지 않은 이유는 무엇일까요?
제가 내공이 부족해서 그런지, 차이가 없어보이는데..
제가 뭔가 오해하고 있는건 어느부분인가요?

static void Spawn_Init_Process(void)
{
    int rc;
    struct Kernel_Thread *initProcess;

    rc = Spawn(INIT_PROGRAM, INIT_PROGRAM,
        &initProcess);

    //Error 처리 부분이 뒤따릅니다.
}

....
int Spawn(const char *program, const char *command, struct Kernel_Thread **pThread)
{
    struct Kernel_Thread *process = 0;

    /* Start the process! */
    process = Start_User_Thread(userContext, false);  // 메모리 할당된 (struct Kernel_Thread *) 를 리턴합니다.
    if (process != 0) {
        KASSERT(process->refCount == 2);
        /* Return Kernel_Thread pointer */
        *pThread = process;    // 여기서, 기껏 더블포인터를 넘긴것을 바로 역참조해서 쓰는군요?

    } else
        rc = ENOMEM;

    return rc;
}

위 코드가 :
int Spawn(const char *program, const char *command, struct Kernel_Thread *pThread); // 본래는 **pThread 입니다.
이렇게 될수는 없는지가 궁금합니다.

hey의 이미지

함수 안에서 포인터 주소를 넘겨주려면, 반환을 해야합니다. 넘겨주려는 포인터를 반환하면 되겠죠. 그런데 반환값을 다른 용도로 쓰고 있다면 매개변수에 담아서 남겨줘야 합니다. 이 때는 넘겨주려는 포인터형으로는 가능하지 않겠죠. pThread는 이미 지역변수이기 때문에 여기에 값을 대입해봤자 함수가 끝나면 사라집니다. 하지만 더블 포인터는 포인터를 담고 있는 곳을 가르키는 포인터이기 때문에, 거기에 값으로 포인터를 넣을 수 있습니다. 더블 포인터는 물론 마찬가지로 지역변수니까 없어지지만 해당 더블 포인터가 가르키고 있는 지점은 여전히 거기 있죠. 거기 대입한 값도 여전히 그대로구요.


----------------------------
May the F/OSS be with you..


댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.