El primero:
Código
Ahí realmente deberias poner:
scanf("%s",&nombres[x][40]);
Código
scanf("%s",nombres[x]);
Al igual que
Código
Que debería ser:
printf("Nombres: %s ",&nombres[x][40]);
Código
printf("Nombres: %s ",nombres[x]);
Por último, has declarado comp como un puntero a char, pero no estas reservando ningún espacio en memoria para almacenarla, sin embargo luego estas tratando de llenarla con scanf("%s",comp); con lo que estás escribiendo en zonas de memoria no reservadas. Para evitar esto declara comp como una cadena de caracteres: char comp[40];
EDIT: también puedes declarar comp como un puntero y luego reservar el espacio dinámicamente:
Código
Pero en este caso no merece la pena ya que es un programa muy simple, solo quería mostrarte las diferentes posibilidades que hay.
char *comp; comp= malloc(40*sizeof(char)); //.... free(comp);