How to pass a struct dynamically allocated to a function in C?

2

The program should 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;
}
    
asked by anonymous 02.10.2018 / 04:00

1 answer

4

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 running on ideone . And no Coding Ground . Also put it in GitHub for future reference .

    
02.10.2018 / 04:38