char *cad1; <--------------- AQUI! lo inicializas apuntando a vaya a saber usted donde
while(i<tam){
cout<<"col[i] "<<col[i]<<endl;
if( EsMayuscula(col[i]) ){
cout<<"es mayus"<<endl;
cad1[i]=col[i]+32; <-------------------- y aqui pones un bonito valor en un offset de cad1 que produce un error de acceso a memoria
Estas usando un puntero sin inicializar.
Deberias, o bien poner (para inicializar con 100 bytes por ejemplo):
char cad1[100]; //e inicializar con 100 bytes
o
char *cad1=(char*)malloc(sizeof(char)*100);
o
char * cad1=new char[100];
El error se produce al salir de la funcion por que es cuando se "limpia" todo lo que hayas usado en la función, y claro, es entonces cuando detecta que has puesto datos donde no debias.