How to pass a dynamically allocated struct to a function in C?
The program must dynamically allocate the struct and pass it as a parameter.
#include <stdio.h>
#include <stdlib.h>
typedef struct cadastro_de_mercadoria{
int codigo;
int estoque;
} CADASTRO;
void printar(CADASTRO cadastruu, int N){
printf("\n\n---------RESULTADO DOS PEDIDOS DOS CLIENTES-------\n\n");
for(int l=0; l<N; l++){
printf("Código da mercadoria %d: %d \n",l+1,cadastruu[l].codigo);
printf("Quantidade da mercadoria no estoque: %d ", cadastruu[l].estoque);
printf("\n\n");
}
}
int main(){
CADASTRO *cadastro;
int N, k, codcli, estoquecli, escolha, encontrado=0;
k=0;
printf("Entre com o número de mercadorias: ");
scanf("%d", &N);
cadastro = (CADASTRO *)malloc(N * sizeof(CADASTRO));
if(cadastro == NULL){
printf("Muita memoria!\n");
return 1;
}
else{
//cadastro das mercadorias
for(int i=0; i<N; i++){
printf ("Entre com o código da mercadoria %d: ",i+1);
scanf ("%d%*c", &cadastro[i].codigo);
printf ("Entre com o estoque da mercadoria %d: ", i+1);
scanf ("%d%*c", &cadastro[i].estoque);
printf ("\n");
}
}
//consulta da mercadoria
printf ("----------PEDIDOS DOS CLIENTES----------\n\n");
while(1){
printf ("Entre com o código da mercadoria: ");
scanf ("%d%*c", &codcli);
encontrado=0;
for(int j=0; j<N; j++){
if(cadastro[j].codigo==codcli){
printf ("Entre com o estoque da mercadoria: ");
scanf ("%d", &estoquecli);
if(cadastro[j].estoque>=estoquecli){
cadastro[j].estoque = cadastro[j].estoque - estoquecli;
printf ("ESTOQUE ATUALIZADO\n");
}
else{
printf ("ESTOQUE INSUFICIENTE!\n");
}
k=1;
}
}
if(k==0){
printf ("MERCADORIA NÃO ENCONTRADA!\n");
}
k=0;
printf("Deseja enviar outra solicitacao? (Sim: 1/Não: 0):: ");
encontrado=0;
scanf("%d", &escolha);
if(escolha==0)
break;
}
printar(cadastro, N);
free(cadastro);
return 0;
}
2
1 answers
The basic error is that the parameter is not declared as a pointer. If the local variable was declared with Pointer the argument will be a pointer, then the parameter will also be, which makes sense. Improving everything would be like this (can improve much more):
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int codigo;
int estoque;
} Cadastro;
void imprimir(Cadastro *cadastro, int n) {
printf ("\n\n---------RESULTADO DOS PEDIDOS DOS CLIENTES-------\n\n");
for (int i = 0; i < n; i++) {
printf("Código da mercadoria %d: %d \n", i + 1, cadastro[i].codigo);
printf("Quantidade da mercadoria no estoque: %d\n\n", cadastro[i].estoque);
}
}
int main() {
int n;
printf ("Entre com o número de mercadorias: ");
scanf ("%d", &n);
Cadastro *cadastro = malloc(n * sizeof(Cadastro));
if (cadastro == NULL) {
printf("Proberlmas de alocação de memoria!\n");
return 1;
} else {
for (int i = 0; i < n; i++) {
printf ("Entre com o código da mercadoria %d: ",i+1);
scanf ("%d%*c", &cadastro[i].codigo);
printf ("Entre com o estoque da mercadoria %d: ", i+1);
scanf ("%d%*c\n", &cadastro[i].estoque);
}
}
printf ("----------PEDIDOS DOS CLIENTES----------\n\n");
while (1) {
printf ("Entre com o código da mercadoria: ");
int codcli;
scanf ("%d%*c", &codcli);
int achou = 0;
for (int i = 0; i < n; i++) {
if (cadastro[i].codigo == codcli) {
printf ("Entre com o estoque da mercadoria: ");
int estoquecli;
scanf ("%d", &estoquecli);
if (cadastro[i].estoque >= estoquecli){
cadastro[i].estoque -= estoquecli;
printf ("ESTOQUE ATUALIZADO\n");
} else printf ("ESTOQUE INSUFICIENTE!\n");
achou = 1;
}
}
if (achou == 0) printf ("MERCADORIA NÃO ENCONTRADA!\n");
printf ("Deseja enviar outra solicitacao? (Sim: 1/Não: 0):: ");
int escolha;
scanf ("%d", &escolha);
if (escolha == 0) break;
}
imprimir(cadastro, n);
free(cadastro);
}
See working on ideone. E no repl.it. also I put on GitHub for future reference .
4
Author: Maniero, 2020-08-07 20:26:30