memória malloc para um ponteiro para ponteiro

Eu me deparei com este problema ao usar o ponteiro para apontar para um char:

<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>

O código acima está correto, mas não consigo entender por que usar um ponteiro para um ponteiro char ** p aqui? Por que apenas usando um ponteiro para um char em vez disso? então eu mudei este trecho para baixo e achei que não estava funcionando, alguém pode me dizer por quê? obrigado!

<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