Problem increasing array size within struct dynamically

Asked

Viewed 39 times

0

Problem

I am doing a test program that receives names of students and their grades, with the number of students being able to increase indefinitely, for this I used a struct with two arrays inside that are dynamically allocated, but when I reallocate the size of the arrays they do not increase. So I think there’s some error in my role();.

Code

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

//Struct
typedef struct structAlunoNotas
{   
    char **nome;
    float **vetNotas;
    int tamanho; //tamanho máximo do array
    int usado; //espaço do array já utilizado
}Notas;

//função que apaga o struct
void apagarNotas(Notas *estrutura)
{
    free(estrutura->nome);
    free(estrutura->vetNotas);
    estrutura->tamanho = 0;
    estrutura->usado = 0;
    free(estrutura);
}

//Função que cria o struct
Notas *criarNotas(unsigned int tamanho)
{
    Notas *estrutura = (Notas *) malloc(sizeof(Notas));
    if(estrutura)
    {
        estrutura->nome = (char **) malloc(tamanho * sizeof(*estrutura->nome));
        for(int i = 0; i <= tamanho; i++)
        {
            estrutura->nome[i] = (char *) malloc(50);
            if(!estrutura->nome)
            {
                return NULL;
            }
        }
        estrutura->vetNotas = (float **) malloc(tamanho * sizeof(*estrutura->vetNotas));
        estrutura->tamanho = tamanho;
        estrutura->usado = 0;
    }
    if((estrutura != NULL) && (tamanho != 0) && (estrutura->nome == NULL) && (estrutura->vetNotas == NULL))
    {
        apagarNotas(estrutura);
        estrutura = NULL;
    }

    return estrutura;
}

//Função que realoca o tamanho do struct
Notas *aumentarNotas(Notas *estrutura)
{
    estrutura->nome = (char **) realloc(estrutura->nome, ((estrutura->usado+5) * sizeof(*estrutura->nome)));
    for(int i = estrutura->usado; i < (estrutura->usado+5); i++)
    {
        estrutura->nome[i] = (char *) malloc(50);
        if(!estrutura->nome)
        {
            return NULL;
        }
    }
    estrutura->vetNotas = (float **) realloc(estrutura->vetNotas, ((estrutura->usado+5) * sizeof(*estrutura->vetNotas)));
    estrutura->tamanho = (estrutura->usado+5);

    if((estrutura == NULL) && (estrutura->nome == NULL) && (estrutura->vetNotas == NULL))
    {
        apagarNotas(estrutura);
        estrutura = NULL;
    }

    return estrutura;
}

int main()
{
    int final = 0;
    Notas *a = criarNotas(1); //cria um array de 2 elementos


    for(int i = 0; i <= 5; i++) //roda 5 alunos
    {
        if(a->usado == a->tamanho) /verifica se o array está cheio
        {
            aumentarNotas(a); //aumenta o array
        }
        printf("\nUsado %d\n", a->usado);
        for(int j = 1; j <= 5; j++)
        {
            printf("\nAluno %d", i);
            printf("\nNota %d: ", j);
            scanf("%f", &a->vetNotas[i][j]);
            printf("%f\n", a->vetNotas[i][j]);
        }
        a->usado++;
        printf("\n");
    }
    apagarNotas(a);
    
    scanf("%d", &final);

    return 0;
}

Input

1
1
1
1
1
1
1
1
1
1
1

Output

Usado 0 //valor de usado dentro do struct (a->usado)

Aluno 0
Nota 1: 1
1.000000

Aluno 0
Nota 2: 1
1.000000

Aluno 0
Nota 3: 1
1.000000

Aluno 0
Nota 4: 1
1.000000

Aluno 0
Nota 5: 1
1.000000


Usado 1

Aluno 1
Nota 1: 1
1.000000

Aluno 1
Nota 2: 1
1.000000

Aluno 1
Nota 3: 1
1.000000

Aluno 1
Nota 4: 1
1.000000

Aluno 1
Nota 5: 1
1.000000


Usado 2

Aluno 2
Nota 1: 1 //O console fecha imediatamente após apertar enter
  • Here: for(int i = 0; i <= tamanho; i++) should be: for(int i = 0; i < tamanho; i++), you are extrapolating the allocated area. Check your others for.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.