Guarda che l'intersezione la stai facendo più complicata di quella che è: non hai bisogno di allocare niente una volta che hai i due insiemi di partenza, li riordini e basta
#include <stdio.h>
struct insieme
{
  double *  a;
  int       l;
};
int intersezione(insieme i1, insieme i2, unsigned int step)
{
    int k, j;
    double temp;
    for(k = step; k < i1.l; k++)
        for(j = step; j < i2.l; j++)
            if(i1.a[k] == i2.a[j])
            {
                temp = i1.a[step];
                i1.a[step] = i1.a[k];
                i1.a[k] = temp;
                temp = i2.a[step];
                i2.a[step] = i2.a[j];
                i2.a[j] = temp;
                return intersezione(i1, i2, step + 1);
            }
    return step;    
}
int main(void)
{
    int n1, n2;
    insieme insieme1, insieme2;
    
    printf ("Inserisci il numero di elementi del primo insieme: ");
    scanf (" %d", &n1);
    if(n1 < 0){
        printf ("Valore immesso non valido\n");
        getchar();
        return -1;
    }
    else if(n1 > 0){
        insieme1.a = (double *)malloc(n1*sizeof(double));
        if(insieme1.a == NULL){
            printf ("Memoria insufficiente\n");
            getchar();
            return -1;          
        }
    }   
    insieme1.l = n1;
    while(n1--){
        printf ("Inserisci elemento: ");    
        scanf(" %lf", &insieme1.a[n1]);
    }
    
    printf ("Inserisci il numero di elementi del secondo insieme: ");
    scanf (" %d", &n2);
    if(n2 < 0){
        printf ("Valore immesso non valido\n");
        getchar();
        return -1;
    }
    else if(n2 > 0){
        insieme2.a = (double *)malloc(n2*sizeof(double));
        if(insieme2.a == NULL){
            printf ("Memoria insufficiente\n");
            getchar();
            return -1;          
        }
    }   
    insieme2.l = n2;
    while(n2--){
        printf ("Inserisci elemento: ");    
        scanf(" %lf", &insieme2.a[n2]);
    }
    
    n2 = intersezione(insieme1, insieme2, 0);
    if(n2 > 0){
	printf("L'intersezione dei due insiemi ha dimensione %d ", n2);
        printf("ed e' composta dagli elementi:\n");
        for(n1 = n2 - 1; n1 >= 0; n1--)
            printf("%lf\n", insieme1.a[n1]);
    }
    else
	printf("L'intersezione dei due insiemi e' vuota\n");
    getchar();
    return 0;
}