Ponteiro para struct | Como inicializar vetor de struct dentro da struct? | C++ | Dúvidas !
Pessoal estou com uma duvida grande, estou estudando estrutura de dados e como consequencia cheguei a parte de ponteiros, ja entendi a questão do conceito de ponteiro, no qual o ponteiro é uma variável que guarda o endereço de memoria de uma outra variável. Ja quando a gente entra na questão da alocação dinamica (malloc, calloc, realloc e free) comecei a me bater com uma coisa em específico. Estou fazendo um programinha de Agenda telefonica, que tem uma "struct AGENDA", que tem parametros como "nome" e um vetor dinamico de outra struct "struct CONTATO" que armazena todos os contatos desejados pelo usuario dinamicamente.
Certo, agora que entendeu um pouco o escopo do programa, a minha dificuldade é a seguinte, como eu inicializo o vetor "struct CONTATO" que está dentro da "struct AGENDA" que foi inicializada dinamicamente?
Abaixo segue o código que fiz até o momento, existem varios erros, mas estou corrigindo a medida que vou percebendo, mas a priore so quero inicializar as estruturas (struct) corretamente e estou me bantendo com a inicialização do vetor de "struct CONTATO" dentro da "struct AGENDA". Caso não tenha entendido algo, comenta aí que tento explicar melhor minha dúvida!
Segue código abaixo
#include <iostream>
#include <string>
using namespace std;
typedef struct contato {
string nome;
string telefone;
string email;
} CONTATO;
typedef struct agenda {
string nome;
CONTATO *listaContato;
} AGENDA;
AGENDA *criarAgenda(string); // RETORNA UM ENDEREÇO DE MEMORIA
void adicionarContato(AGENDA *); // RECEBE ENDEREÇO DE MEMORIA CORRESPONDENTE A
// AGENDA CRIADA COMO PARAMETRO
void editarContato(string);
void excluirContato(string);
void listarContato();
int main() {
// ADICIONANDO CHARACTERES ESPECIAIS
setlocale(LC_ALL, "Portuguese");
// DECLARANDO VARIAVEIS
string nome;
AGENDA *ptrAgenda;
int sairMenu = 0, opcaoMenu;
// ENTRADA DE DADOS
cout << "Digite o seu nome: " << endl;
cin >> nome;
cout << "\n" << endl;
ptrAgenda = criarAgenda(nome);
// MENU
do {
cout << "Agenda de " << nome << ": " << endl;
cout << "\n" << endl;
cout << "1 - Adicionar Contato " << endl;
cout << "2 - Listar Contatos " << endl;
cout << "3 - Excluir Contato " << endl;
cout << "4 - Fechar Agenda " << endl;
cin >> opcaoMenu;
switch (opcaoMenu) {
case 1:
adicionarContato(ptrAgenda);
break;
case 2:
// listarContato();
break;
case 3:
// excluirContato("string");
break;
case 4:
sairMenu++;
break;
default:
cout << "Opção invalida, favor tentar novamente! " << endl;
break;
}
} while (sairMenu == 0);
return 0;
}
// FUNCIONALIDADES
AGENDA *criarAgenda(string nomeUsuario) {
AGENDA *novaAgenda;
novaAgenda = (AGENDA *)malloc(sizeof(AGENDA)); // RESERVANDO ENDEREÇO DE MEMORIA PARA AGENDEA
cout << "Criou ponteiro para agenda - OK " << endl; // SAÍDA DE TEXTO PARA SABER EM QUAL LINHA ESTÁ TRAVANDO O CODIGO
novaAgenda->nome = nomeUsuario;
cout << "Adicionou o nome de usuario, sendo ele - OK " << novaAgenda->nome << endl;
novaAgenda->listaContato = (CONTATO *)malloc(sizeof(CONTATO));
novaAgenda->listaContato->nome = "NULL";
novaAgenda->listaContato->telefone = "NULL";
novaAgenda->listaContato->email = "NULL";
cout << "Criou lista contato de boa aparentemente, nome: " << endl;
return novaAgenda;
};
void adicionarContato(AGENDA *agenda) {
// ENTRADA
string nomeContato, telContato, emailContato;
cout << "Digite o nome do contato: " << endl;
cin >> nomeContato;
cout << "Digite o telefone do contato: " << endl;
cin >> telContato;
cout << "Digite o email do contato: " << endl;
cin >> emailContato;
// PROCESSAMENTO
int tamContato =
(int)(sizeof(agenda[0].listaContato)) /
(int)(sizeof(agenda[0].listaContato[0])); // descobrindo tamanho da array
cout << "tamanho array: " << tamContato << endl;
agenda[0].listaContato[tamContato].nome = nomeContato;
agenda[0].listaContato[tamContato].telefone = telContato;
agenda[0].listaContato[tamContato].email = emailContato;
};