0

生徒のデータ (名前、点数、生徒番号) を含むリストを表す ac プログラムを作成する必要がありますが、生徒の名前を正しく保存する方法がわかりません。

ポインターを使用しようとしましたが、新しい名前を割り当てようとすると、古い名前が上書きされます。

これが私が使用しているコードです...誰かが私を助けることができますか?

lista.h

typedef struct _lista lista;
typedef struct _dados dados;

typedef struct _dados{
    int matricula;
    float media;
    char *nome;
}_dados;

typedef struct _lista {
    int fim;
    dados *d[max];
}_lista;

lista* criar_lista();
dados* novo_dado(char *nome, int matricula, float media);
void imprimir(dados *dado);

lista.c

lista* criar_lista(){
    lista* L = (lista *) malloc(sizeof (lista));
    L->fim = -1;
    return L;
}

dados* novo_dado(char *nome, int matricula, float media){

    dados* d = (dados *) malloc(sizeof (dados));
    d -> matricula = matricula;
    d -> media = media;
    d -> nome = nome;
    return d;
}

void imprimir(dados *dado){
    printf("%s: ", dado->nome);
    printf("%d ", dado->matricula);
    printf("%.2f\n", dado->media);
}

main.c

lista *L1;
char nome[15];
int matricula;
float media;

L1 = criar_lista();



for (i=0;i<n;i++){
    fscanf(entrada,"%s", nome);
    fscanf(entrada,"%d", &matricula);
    fscanf(entrada,"%f", &media);
    inserir(L1,novo_dado(nome,matricula,media));

}

入力:

8
Vandre 45 7.5
Joao 32 6.8
Mariana 4 9.5
Carla 7 3.5
Jose 15 8
Fernando 18 5.5
Marcos 22 9
Felicia 1 8.5

出力:

Felicia 45 7.5
Felicia 32 6.8
Felicia 4 9.5
Felicia 7 3.5
Felicia 15 8
Felicia 18 5.5
Felicia 22 9
Felicia 1 8.5 and so on...
4

1 に答える 1

1

変化する

d -> nome = nome;

d -> nome = strdup(nome);

これにより、ヒープに新しい char 配列が割り当てられ、文字列がコピーさd->nomeれ、その先頭に設定されます。したがって、それぞれdadonome独自の配列に独自の文字列を持ちます。

を破棄する直前にdado、 を呼び出すことを忘れないでくださいfree(d->nome);。そうしないと、メモリ リークが発生します。

于 2013-09-22T22:53:28.347 に答える