Per il passaggio di radice alla funzione, posso provare come dici tu ma ho gia costatato che il valore radice viene passato correttamente nella funzione e anche alla cariabile corr con delle printf subito dopo i passaggi.
Il crash l'ho risolto inserendo le allocazioni di memoria dei nodi figli.

corr->sinistro = calloc(1, sizeof (struct nodo));
corr->destro = calloc(1, sizeof (struct nodo));

Ho modificato anke tutte le altre allocazioni di memoria da malloc a calloc.
Con malloc ad ogni ciclo while mi tornava la copia dell'indirizzo di memoria, adesso mi torna il valore 0 sempre.

Questo è il codice aggiornato


codice:
#include <stdio.h>
#include <stdlib.h>

struct nodo{
    int valore;
    struct nodo *sinistro;
    struct nodo *destro;
};

typedef struct nodo NODO;

void CreaAlbero(int Array[], int dim, void **);
void PREORDER(void **);
void INORDER(void **);
void POSTORDER(void **);

void main()
{
    int dim;

    printf("Inserire la dimensione dell'array (numero elementi albero binario):\n");
    scanf("%d",&dim);

    int Array[dim];

    int i;
    for(i=0; i<dim; i++)
    {
        printf("Inserire un valore numerico: ");
        scanf("%d",&Array[i]);
    }

    NODO *radice;
    radice = calloc(1, sizeof (struct nodo));
    radice->valore = Array[0];

    system("cls");
    printf("Creazione albero...\n\n");

    CreaAlbero(Array, dim, (void **)&radice);

    INIZIO:
    printf("\n");
    int selezione;

    printf("Digitare:\n");
    printf("0 per la visita preorder\n");
    printf("1 per la visita inorder\n");
    printf("2 per la visita postorder\n");

    scanf("%d",&selezione);

    switch(selezione)
    {

        case 0:
        {
            printf("\nVisita dell'albero in ordine Preoder\n");
            PREORDER((void **)&radice);
        }
        break;

        case 1:
        {
            printf("\nVisita dell'albero in ordine Inorder\n");
            INORDER(radice);
        }
        break;

        case 2:
        {
            printf("\nVisita dell'albero in ordine Postorder\n");
            POSTORDER(radice);
        }
        break;
    }

    system("pause");
    system("cls");
    goto INIZIO;

    _getch();
}


void CreaAlbero(int Array[], int dim, void **radice)
{
    int i = 0;

    printf("\n");
    NODO *pt;
    pt = calloc(1, sizeof (struct nodo));

    while(i < dim-1)
    {
        pt->valore = Array[i+1];

        NODO *corr;
        corr = calloc(1, sizeof (struct nodo));
        corr = *radice;

        corr->sinistro = calloc(1, sizeof (struct nodo));
        corr->destro = calloc(1, sizeof (struct nodo));

        while(pt->valore <= corr->valore && corr->sinistro != NULL)
        {
            corr = corr->sinistro;
        }

        while(pt->valore >= corr->valore && corr->destro != NULL)
        {
            corr = corr->destro;
        }

        if(pt->valore >= corr->valore)
        {
            corr->sinistro = pt;
        }
        else
        {
            corr->destro = pt;
        }

        i++;
        printf("\n");
    }
}


void PREORDER(void **radice)
{
    NODO *nodo;
    nodo = *radice;

    if(nodo != NULL)
    {
        printf("%d\n", nodo->valore);
        PREORDER( nodo->sinistro );
        PREORDER( nodo->destro );
    }
}


void INORDER(void **radice)
{
    NODO *nodo;
    nodo = *radice;

    if(nodo != NULL)
    {
        INORDER( nodo->sinistro );
        printf("%d\n", nodo->valore);
        INORDER( nodo->destro );
    }
}


void POSTORDER(void **radice)
{
    NODO *nodo;
    nodo = *radice;

    if(nodo != NULL)
    {
        POSTORDER( nodo->sinistro );
        POSTORDER( nodo->destro );
        printf("%d\n", nodo->valore);
    }
}