Con la funzione void Inizializza(int N, int M, int* H) ti veniva passato l’array H (o meglio, un puntatore al suo primo elemento).
Un modo per tenere un riferimento permanente ad H poteva essere salvare il puntatore in un’altra variabile dello stesso tipo:
int* h;
void Inizializza(int N, int M, int* H) {
h = H;
// altro codice
}
int Cambia(int P, int V) {
// qui puoi usare h
}
Comunque, l’errore Execution killed with signal <numero> (could be triggered by violating memory limits) molto spesso, forse anche troppo spesso, non è legato alla quantità di memoria allocata. Per esempio vedi questo topic.