Boa tarde, sou iniciante em programação em C e estou tentando criar um programa que registre produtos de um supermercado e suas informações como unidades diponíveis, nome, preço de compra e venda etc.. No entanto, a quantidade de produtos a serem cadastrados é desconhecida, preciso que o usuário possa, por exemplo, regitrar x produtos numa execução, voltar ao menu e depois registrar mais y produtos. Preciso fazer isso usando malloc e realloc, mas estou tendo alguns problemas e dúvidas.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
struct n_produto
{
char nome[150];
float valorV;
float valorC;
int unidades;
};
void menu();
void new_p(struct n_produto *newp, int *qt);
int main()
{
setlocale(LC_ALL,"");
// Variáveis
int op,qtp=1;
struct n_produto *newp;
newp = malloc(qtp*sizeof(struct n_produto));
if(newp==NULL)
{
printf("erro ao alocar");
exit(1);
}
while(op>=0)
{
menu();
printf("\n\n\n\tDigite o número correspondente\n\ta opção desejada: ");
scanf("%d",&op);
system("cls");
printf("\n");
switch(op)
{
case 1:
new_p(newp,&qtp);
break;
}
}
return 0;
}
void menu()
{
printf("\t=====PAINEL DE CONTROLE DO SUPERMERCADO=====\n\n");
printf("\n\t[1] Adicionar produtos ao estoque.\n\n");
}
void new_p(struct n_produto *newp, int *qt)
{
if(*qt > 1) newp += *qt;
printf("\tNome do produto: ");
fflush(stdin);
fgets(newp->nome,150,stdin);
printf("\tUnidades: ");
scanf("%d",&newp->unidades);
printf("\tPreço de venda: ");
scanf("%f",&newp->valorV);
printf("\tPreço de compra: ");
scanf("%f",&newp->valorC);
system("cls");
*qt = *qt + 1; // Aumenta o valor que representa quantidades de produtos
newp = realloc(newp,*qt*sizeof(struct n_produto)); // Realoca o vetor com uma posição a mais para um próximo produto
if(newp==NULL)
{
printf("erro ao realocar");
exit(1);
}
}
A alocação e realocação estão corretas? Nas execuções que fiz em nenhum momento o erro de ponteiro NULL foi exibido, mas ainda assim o programa para quando tento ler valores nas posições supostamente realocadas.
Esse método newp += *qt serve para pular a posição do ponteiro ou está errado?
Agradeço a quem puder ajudar, estou a dias tentando dar continuidade a esse programa mas fiquei travado nessa parte.