Dúvida sobre alocação dinâmica

Eu tenho um projeto da escola em que eu fui instruido a usar somente locação dinamica no meu programa, e nele necessito de duas estruturas em que em uma delas tem um vetor:

typedef struct pilha Pilha;
struct pilha{
	int qtdPilhas;
	int *position;
	int timeCor;	
};

typedef struct time Time;

struct time{
	Pilha *p;
};

No codigo para inserir a cor do time, eu usaria → para definir o valor de meu ponteiro, mas o programa só compila se eu não determinar qual vetor eu quero inserir esse valor:

void coresTimes(int time1,int time2,int time3,int time4){
	for(int i=0;i<qtdJogadores;i++){
	t1.p[i]->timeCor = time1;
	t2.p[i]->timeCor = time2;
	t3.p[i]->timeCor = time3;
	t4.p[i]->timeCor = time4;
	}
}

Eu vi na internet que para passar valores para um ponteiro deve se usar o ->, mas no meu caso o programa só compila se eu usar p[i].timeCor = time1.Minha duvida é se por usar o ponto meu vetor ainda vai estar alocando dinamicamente meus valores

Mas p não é um vetor, olha só:

struct time{
    Pilha *p;
};

No seu código não tem nenhum vetor declarado.

E no caso como eu declararia esse vetor como ponteiro na struct? Mais pra frente no meu codigo eu uso um malloc para estabilizar a quantidade de vetores dele

//Atribuindo o vetor para os ponteiros da Pilha
for(int i=0;i<4;i++){
	times[i]->p =  (int *) malloc(qtdJogadores*sizeof(int *));
	}

Esse p não é uma Pilha? Por que está atribuindo um ponteiro para int?