¿Que problema tiene declarar int vector1[tam1], vector2[tam2]; según el estándar? ¿De alguna forma hay que declararlo no?
Lo de pisar memoria solo si fuera:
int tam1, tam2;
int vector1[tam1], vector2[tam2];
...Porque:
int tam1= 10, tam2=10;
int vector1[tam1], vector2[tam2];
...No veo en que va pisar memoria ninguna.