Realmente, o tipo Link é um stackNode *, então vamos reescrever o código para facilitar:
void
stackInit(stackNode **topo)
{
*topo = malloc(sizeof **topo);
(*topo)->prox = NULL;
}
O que me faz acreditar que o código inicial estava correto. Substituindo stackNode * por Link, temos:
void
stackInit(Link *topo)
{
topo = malloc(sizeof *topo);
topo->prox = NULL;
}
Que é o código que tínhamos inicialmente. Repare que *topo é um stackNode, então sizeof *topo parece estar de acordo.
Por esse mesmo motivo, (*topo)->prox = NULL daria erro, porque *topo é um StackNode, tornando a notação -> inválida. O que acha?
Uma vez que você tem um tipo Link definido, acredito que topo->prox seja uma notação válida, porque topo é um ponteiro para Link (ainda que Link seja stackNode*).
Coelho, ainda resta a dúvida se a função, do jeito que foi escrita, irá modificar o ponteiro passado como parâmetro e fazê-lo apontar para a cabeça alocada.