Salve a tutti!

Ho scritto questo codice, che serve a calcolare la derivata di un polinomio:

codice:
typedef int  *poly;
typedef poly *der;

der derivative(poly P, int N, int k);
int calcolaDerivata(int coeff, int grado);

der derivative(poly P, int N, int k)
{
   int i, j, f;
   der d;
   poly p2;
   poly pp;
   
   d = calloc(N, sizeof(poly));
   p2 = calloc(k+1, sizeof(int));
   
   for( i=0; i<N; i++ )
   {
      p2 = calloc(k+1, sizeof(int));
      
      for( j=0; j<=k; j++ )
      {
         p2[j] = calcolaDerivata(P[j], j+1);
         printf("%d: %d -- %d\n",j,P[j],p2[j]);
      }

      k -= 1;
      d[i] = p2;
      printf("\n\nIndirizzo: %p\n\n", p2);
      pp=d[i];
      
      printf("i: %d\nd: %d %d %d %d\n",i, pp[0], pp[1], pp[2], pp[3] );
      getch();
      
      for( f=0; f<=k; f++ )
         P[f]=p2[f+1];
      free(p2);
   }
   
   pp=d[0];
      
      printf("\n\nUscita ciclo:\n\ni: %d\nd: %d %d %d %d",i, pp[0], pp[1], pp[2], pp[3] );
      getch();
   return d;
}

int calcolaDerivata(int coeff, int grado)
{
   if( grado == 1 )
      return 0;
   else
      return coeff*(grado-1);
}
poly è semplicemente un array di interi, der è un array di poly.

Non voglio discutere dell'algoritmo: il mio problema è che, ciclando per i, quando assegno a d[i] il poly p2 mi sovrascrive con l'ultimo valore di p2 TUTTI gli elementi di d. Come mai? Stampo il valore di p2 ad ogni iterazione ed è giustamente ogni volta diverso, però quando lo assegno a d[i] me lo copia su tutti gli elementi di d. Ad esempio, se d[0]=p1, d[1]=p2 quando vado ad assegnare d[2]=p3 ho sia d[0] che d[1] uguali a p3.
Sicuramente mi sto perdendo in un bicchier d'acqua, però non riesco a uscirne. Grazie!!!