web-dev-qa-db-fra.com

C - initialiser un tableau de structures

J'ai un problème lors de l'initialisation d'un tableau de structures. Je ne sais pas si je le fais bien parce que j'obtiens "initialisation à partir d'un type de pointeur incompatible" et "affectation à partir d'un type de pointeur incompatible". J'ai ajouté dans le code où je reçois ces avertissements, et lorsque j'essaie d'imprimer les données de la structure, je reçois juste des ordures telles que @@ ###

typedef struct
{
    char* firstName;
    char* lastName;
    int day;
    int month;
    int year;

}student;

// initialise le tableau

    student** students = malloc(sizeof(student));
    int x;
    for(x = 0; x < numStudents; x++)
    {
        //here I get: "assignment from incompatible pointer type" 
        students[x] = (struct student*)malloc(sizeof(student));
    }

    int arrayIndex = 0;

// add struct

 //create student struct
        //here I get: "initialization from incompatible pointer type"
        student* newStudent = {"john", "smith", 1, 12, 1983};

        //add it to the array
        students[arrayIndex] = newStudent;
        arrayIndex++;
17
Tony

Ceci est une erreur:

student** students = malloc(sizeof(student));

Vous ne voulez pas de **. Vous voulez un * et suffisamment d'espace pour le nombre d'élèves dont vous avez besoin

student *students = malloc(numStudents * sizeof *students); // or sizeof (student)
for (x = 0; x < numStudents; x++)
{
    students[x].firstName = "John"; /* or malloc and strcpy */
    students[x].lastName = "Smith"; /* or malloc and strcpy */
    students[x].day = 1;
    students[x].month = 12;
    students[x].year = 1983;
}

Si vous souhaitez toujours utiliser le code dans votre section "// add struct", vous devrez modifier la ligne:

student* newStudent = {"john", "smith", 1, 12, 1983};

à

student newStudent = {"john", "smith", 1, 12, 1983};

Vous obteniez "initialisation à partir d'un type de pointeur incompatible" car vous tentiez d'initialiser un pointeur sur student avec un objet de type student.

28
pmg

Sans rapport avec les avertissements du compilateur, mais votre malloc initial est incorrect; tu veux:

malloc(sizeof(student *)* numStudents)

Pour allouer de la place pour un total de pointeurs "numStudents" à un étudiant. La ligne:

students[x] = (struct student*)malloc(sizeof(student));

Devrait être:

students[x] = (student*)malloc(sizeof(student));

Il n'y a rien de tel que "struct étudiant". Vous avez déclaré une structure sans nom et l'avez tapée à "étudiant". Comparez et contrastez avec:

struct student
{
    char* firstName;
    char* lastName;
    int day;
    int month;
    int year;

};

Ce qui créerait un type "étudiant structuré" mais exigerait que vous (en C) vous référiez explicitement à étudiant structuré plutôt qu'à simplement étudiant ailleurs. Cette règle est modifiée pour C++, donc votre compilateur peut être un peu flou à ce sujet.

Pour ce qui est de:

student* newStudent = {"john", "smith", 1, 12, 1983};

Ça devrait être:

student newStudent = {"john", "smith", 1, 12, 1983};

Comme la syntaxe des accolades est un littéral direct, pas quelque chose d'autre que vous devez indiquer.

EDIT: après réflexion, je pense que aaa a peut-être pris plus de vue d'ensemble que moi. Est-il possible que vous utilisiez par inadvertance un niveau supplémentaire de déréférence de pointeur partout? Vous voudriez donc:

student* students = malloc(sizeof(student) * numStudents);

/* no need for this stuff: */
/*int x;
for(x = 0; x < numStudents; x++)
{
    //here I get: "assignment from incompatible pointer type" 
    students[x] = (struct student*)malloc(sizeof(student));
}*/

int arrayIndex = 0;

Et:

student newStudent = {"john", "smith", 1, 12, 1983};

//add it to the array
students[arrayIndex] = newStudent;
arrayIndex++;

Soumettez le tableau non utilisé en dehors de la portée de newStudent. Sinon, la copie des pointeurs vers des chaînes est incorrecte.

8
Tommy
student* students = malloc(sizeof(student)*numStudents);
int x;
for(x = 0; x < numStudents; x++)
{
    student newStudent = {"john", "smith", 1, 12, 1983}; // string copy are wrong still
    students[x] = newStudent;
}
3
Anycorn