Non dovresti mai restituire il puntatore di una variabile definita nello stack, perchè potrebbe non avere più i valori che ti aspetti una volta terminata la funzione. In questo caso creala nell'heap (e ricordati di liberarne la memoria):
codice:
int *cardinalitalettere(char *p, int NUM) {
     int i, k, t;
     //int vettore_numerativo[NUM];
     //v = vettore_numerativo;
     int *v = (int*)malloc(sizeof(int) * NUM);
     ...
}

int main(){
  ...
  free(c);
  return 0;
}