1
resposta

Malloc e Realloc dentro de funções

Eu tenho 3 arquivos, um arquivo main.c, um arquivo funcao.h e funcao.c (nomes hipotéticos). Na minha header, eu só tenho as assinaturas das funções e uma struct do tipo alunos.

main.c

#include <stdio.h>
#include <stdlib.h>
#include "operacoes.h"

int main()
{
    Aluno *alunos;
    menu_iniciar_sala(alunos);
    return 0;
}

funcao.h

#define MAX_ALUNOS 200

typedef struct aluno{
    char nome[50];
    int idade;
} Aluno;

void iniciar_sala(Aluno * alunos);

funcao.c

void iniciar_sala(Aluno * alunos){
    alunos = (Aluno *) malloc(*quantidade_cadeiras_disponiveis * sizeof(Aluno));
    Aluno novo_aluno;
    novo_aluno.nome = "Daiane Silva";
    novo_aluno.idade = 18;
    alunos[0] = novo_aluno;
}

O problema: Eu não estou conseguindo com que as alterações feitas na funcao.c, seja modificadas em alunos dentro do main; Eu também não consigo fazer realloc dentro de uma outra função em funcao.h...

1 resposta

Olá, tem algumas coisas que você vai ter que rever para resolver.

Então vamos por partes:

Essa sua estruta pode ter 1 (um) aluno que pode ter um nome com no máximo 50 caracteres. Se você quer ter alguma coisa tipo Aluno e Sala, tem que fazer de outra forma. Voce pode ter varios alunos e colocar num vetor ou criar uma outra struct e dentro dela colocar um vetor de alunos. Esse são só exemplos.

Agora seguindo seu pensamento com a função iniciar_sala, vc poderia criar uma segunda estrutura tipo SalaDeAula, alocar ela fora da função, passar o ponteiro dela. Ai na função vc criar um aluno e colocar o ponteiro do aluno dentro da estrutura SalaDeAula.

Fiz um código mais simples para explicar mais ou menos:

#include <stdio.h>
#include <stdlib.h>
#include <cstring>

#define MAX_ALUNOS 200

int cadeira = 0;

struct TAluno{
    char nome[50];
    int idade;
};

struct TSala{
    TAluno Alunos[MAX_ALUNOS];
};

void iniciar_sala(TSala * s){

    TAluno aluno;
    sprintf( aluno.nome, "Primeiro aluno da cadeira %d", cadeira);
    aluno.idade = 18;

    s->Alunos[cadeira] = aluno;
    cadeira++;
}

void iniciar_sala(TSala * s, TAluno a){        
    s->Alunos[cadeira] = a;
    cadeira++;
}

int main()
{
    TSala sala;    
    iniciar_sala(&sala);

    printf("SALA - Nome: %s - Idade: %d.\n\n", sala.Alunos[0].nome, sala.Alunos[0].idade); 

    iniciar_sala(&sala);
    printf("SALA - Nome: %s - Idade: %d.\n\n", sala.Alunos[1].nome, sala.Alunos[1].idade); 

    TAluno novoAluno;
    strcpy(novoAluno.nome, "Novo Aluno");
    novoAluno.idade = 10;
    iniciar_sala(&sala, novoAluno);

    printf("SALA - Nome: %s - Idade: %d.\n\n", sala.Alunos[2].nome, sala.Alunos[2].idade); 

    return 0;
}