0

d->idはそれをリストに載せるように頼みます、しかし私が複数を頼むならば、すべてのリストアイテムは最後のものを手に入れます。

たとえば、forが2回の反復であり、novo->prato[0]"M1"これはユーザーに尋ねられます)でありnovo->prato[1]、である"M3"場合、両方の位置はに留まり"M3"ます。なんで?

コードは次のとおりです。

typedef struct pedido pedido, *ppedido;
typedef struct prato prato, *pprato;

struct pedido{
    char id[5];
    int prioridade;
    int mesa, n_pratos;
    pprato prato[TAM];
    ppedido prox;
};

struct prato{
    char id[5];
};

int verifica_prato(ppedido p,int j)
{
    FILE *f;
    struct item aux;

    int i=0;

    f = fopen("menu.bin", "rb");
    if(f == NULL){printf("O sistema nao consegue aceder a memoria");return;}

    while((fread(&aux, sizeof(struct item), 1, f)) == 1){
        if((strcmp(p->prato[j]->id, aux.id)) == 0)
            i++;
    }
    fclose(f);

    if(i == 0){
    printf("Prato nao existe no menu.\n");
    return 1;
        }

    if(i > 1)
    return 0;
}


for(i=0;i<novo->n_pratos;i++){
        do{
            printf("ID do prato %d: ", i+1);
            scanf("%s", &d->id);
            novo->prato[i] = d;
            k = verifica_prato(novo,i);

        }while(k != 0);
    }
4

1 に答える 1

1

d を行うときに構造体にポインタを割り当てているnovo->prato[i] = dので、変更を加えるたびに、prato配列のすべての値が同じアドレスを指しているため、dに反映されます。novo->prato[i]d

何をしようとしているのか正確にはわかりませんが、1つの方法はd、ユーザーに入力を求める前に、ループ内で毎回mallocすることです。prato[i]最終的にはメモリを「解放」することも検討する必要があることを忘れないでください。

于 2012-06-24T04:07:30.343 に答える