pamięć malloc do wskaźnika na wskaźnik

Natknąłem się na ten problem podczas używania wskaźnika do wskaźnika na znak:

<code>void setmemory(char** p, int num)
{
    *p=(char*)malloc(num);
}

    void test(void)
    {
        char* str=NULL;
        setmemory(&str,100);
        strcpy(str,"hello");
        printf(str);
    }

int main()
{
    test();
    return 0;
}
</code>

Powyższy kod jest poprawny, ale nie mogę zrozumieć, dlaczego tutaj za pomocą wskaźnika na znak ** wskaźnika? Dlaczego zamiast tego używasz wskaźnika do znaku? więc zmieniłem ten fragment na poniższy i stwierdziłem, że nie działa, czy ktoś może mi powiedzieć dlaczego? dzięki!

<code>void setmemory(char* p, int num)
{
    p=(char*)malloc(num);
}

void test(void)
{
    char* str=NULL;
    setmemory(str,100);
    strcpy(str,"hello");
    printf(str);
}

int main()
{
    test();
    return 0;
}
</code>

questionAnswers(4)

yourAnswerToTheQuestion