En la estructura, Información es un puntero y no un objeto. Si no inicializas el puntero te va a dar error.
Solución 1, convertirlo de puntero a objeto:
#include <cstdlib>
#include <iostream>
using namespace std;
struct Datos {
char *Nombre;
int Edad;
};
struct Categorias {
char *Deporte;
int Atletas;
Datos Informacion;
};
int main(int argc, char *argv[])
{
Categorias *Otro= new Categorias[10];
Otro[0].Informacion.Nombre = "Miau";
return EXIT_SUCCESS;
}
Solución 2:
#include <cstdlib>
#include <iostream>
using namespace std;
struct Datos {
char *Nombre;
int Edad;
};
struct Categorias {
char *Deporte;
int Atletas;
Datos *Informacion;
};
int main(int argc, char *argv[])
{
Categorias *Otro= new Categorias[10];
Otro[0].Informacion = new Datos;
Otro[0].Informacion->Nombre= "Oscar";
return EXIT_SUCCESS;
}
Solución 3, usar un constructor que lo inicialize:
#include <cstdlib>
#include <iostream>
using namespace std;
struct Datos {
char *Nombre;
int Edad;
};
struct Categorias {
char *Deporte;
int Atletas;
Datos *Informacion;
Categorias() { Informacion = new Datos;}
};
int main(int argc, char *argv[])
{
Categorias *Otro= new Categorias[10];
Otro[0].Informacion->Nombre= "Oscar";
return EXIT_SUCCESS;
}
Solución 4, inicializar nombre desde un constructor:
#include <cstdlib>
#include <iostream>
using namespace std;
struct Datos {
char *Nombre;
int Edad;
Datos(char* nombre) : Nombre(nombre) {}
};
struct Categorias {
char *Deporte;
int Atletas;
Datos *Informacion;
Categorias(char* Nombre = NULL) { Informacion = new Datos(Nombre);}
};
int main(int argc, char *argv[])
{
Categorias *Otro= new Categorias("Oscar");
return EXIT_SUCCESS;
}