Es muy sencillo, la razon es que no estas asignadole espacio en memoria a tu apuntador char *cad2, es un error muy comun para aquellos que comienzan con apuntadores, cuando declaras cad2 = "hola", por defecto le asigna 5 espacios (4 para las letras y uno para el caracter de fin de cadena), entonces a la hora que haces strcpy( cad2, cad1); como cad2 tiene espacio para 5, y cad1 tiene espacio para 100, por eso da error. al hacerlo al reves, cad1 tiene espacio suficiente para guardar 5 caracteres, ya que lo defines con espacio para 100.
La solucion es usar malloc/free para asignar/liberar la memoria si utilizas C, o new/delete si utilizas C++.
Suponiendo que uses C, ya que veo que usas printf y printf es de C, la solucion seria:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
char cad1[100]="javi";
char *cad2
= (char*) malloc(sizeof(char) * 100);
strcpy(cad2
, "hola"); //cuando usas apuntadores, debes usar strcpy para asignar en lugar de cad2 ="hola"
// Cuando terminas de usar el apuntador, debs liberar la memoria con free
return 0;
}