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 othersfor
.– anonimo