memoria malloc a puntero a puntero

He encontrado este problema cuando uso el puntero para apuntar a un 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>

El código anterior es correcto, pero no puedo entender por qué usar un puntero a un carácter de puntero ** p aquí? ¿Por qué solo usar un puntero a un char en su lugar? Así que cambié este fragmento por debajo y lo encontré no funcionó, ¿puede alguien decirme por qué? ¡Gracias!

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta