2010-11-13 16 views
15

Tengo un problema al inicializar una matriz de estructuras. No estoy seguro si lo estoy haciendo bien porque obtengo "inicialización del tipo de puntero incompatible" & "asignación del tipo de puntero incompatible". He añadido en el código donde consigo estas advertencias, y cuando intento imprimir los datos de la estructura apenas consigo la basura como @@ ###C - initialize array of structs

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

}student; 

// inicializar gama

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; 

// añadir 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++; 
+1

Parece que su código está a medio camino entre crear dinámicamente una matriz de estructuras de alumnos y crear dinámicamente una matriz de punteros a las estructuras de los alumnos, y luego crear dinámicamente cada estructura de alumno a la que se apunta. No es obvio cuál estás tratando de hacer, lo que hace que contestar esto sea difícil. –

Respuesta

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

No, no, no!

Usted no quiere un **. ¿Quieres un espacio * y suficiente para que los estudiantes cómo cada vez que necesita muchos

student* students = malloc(numStudents * sizeof *students); 
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; 
} 
+1

Seguramente quiere decir 'estudiantes * estudiantes = malloc (numStudents * sizeof (estudiante))', ¿verdad? – GnP

+1

@GnP: Prefiero usar el objeto como argumento para el operador 'sizeof'. Con 'struct something * ptr;' aplicando el operador al tipo (parenthesised) 'struct something' o al objeto' * ptr' produce el mismo valor. 'sizeof * ptr == sizeof (struct algo)'. – pmg

+0

Gracias @prng. Estaba confundido por la sintaxis hasta que me di cuenta que 'sizeof' es un operador unario y no una función en C. – GnP

2
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; 
} 
7

sin relación con las advertencias del compilador, pero su malloc inicial es incorrecto; desea:

malloc(sizeof(student *)* numStudents) 

Asignar espacio para un total de punteros numStudents a un alumno. La línea:

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

debe ser:

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

No hay tal cosa como 'estudiante struct'. Has declarado una estructura no nombrada y la definiste como 'estudiante'. Comparar y contrastar con:

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

}; 

lo que crearía un tipo de 'estudiante struct' pero se requieren (en C) para referirse explícitamente a struct estudiante en lugar de limitarse a los estudiantes en otros lugares. Esta regla se cambia para C++, por lo que su compilador puede ser un poco confuso al respecto.

cuanto a:

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

Eso debería ser:

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

Como la sintaxis de corchete es una directa literal, no es algo en otro lugar que tiene que apuntar.

EDITAR: en la reflexión, creo que aaa puede haber tenido más de una visión general de esto que yo. ¿Es posible que inadvertidamente estés usando un nivel extra de referencia de puntero en todas partes? Así que te gustaría:

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; 

Y:

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

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

Asunto de la matriz no está utilizando de algún alcance de newStudent. De lo contrario, copiar los punteros a cadenas es incorrecto.

-1

Al inicializar, shoudn't que ser así?

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

Sin embargo, ¿por qué puntero a un puntero? Solo con un puntero a struct es suficiente, creo.