Tengo un problema al inicializar una matriz de estructuras. No estoy seguro de si lo estoy haciendo bien porque obtengo “inicialización de un tipo de puntero incompatible” y “asignación de un tipo de puntero incompatible”. Agregué en el código donde recibo estas advertencias, y cuando intento imprimir los datos de la estructura, solo obtengo basura como @@###
typedef struct
{
char* firstName;
char* lastName;
int day;
int month;
int year;
} student;
// Initialize array
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++;
pmg
Esto es incorrecto:
student** students = malloc(sizeof(student));
no quieres un **
. Quieres un *
y espacio suficiente para la cantidad de estudiantes que necesite
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 aún desea usar el código en su sección “//agregar estructura”, deberá cambiar la línea:
student* newStudent = {"john", "smith", 1, 12, 1983};
a
student newStudent = {"john", "smith", 1, 12, 1983};
Obtuvo “inicialización de un tipo de puntero incompatible” porque estaba intentando inicializar un puntero a student
con un objeto de tipo student
.
-
Seguramente te refieres
student* students = malloc(numStudents * sizeof(student) )
¿bien?– PNB
16 de julio de 2016 a las 23:38
-
@GnP: prefiero usar el objeto en sí como argumento para el
sizeof
operador. Construct something *ptr;
aplicando el operador al tipo (entre paréntesis)struct something
o al objeto*ptr
da el mismo valor.sizeof *ptr == sizeof (struct something)
.– pmg
17/07/2016 a las 19:10
-
Gracias @prng. Estaba confundido por la sintaxis hasta que me di cuenta
sizeof
es un operador unario y no una función en C.– PNB
17/07/2016 a las 20:32
-
por qué no puedo acceder a mi variable miembro usando
students[x]->firstName
¿por ejemplo?– xxks-kkk
4 de enero de 2017 a las 2:31
-
@zack: porque
.
se usa con objetos, y->
se utiliza con punteros. Después de la declaraciónstudent *students;
cada indexación enstudents
produce un objeto de tipostudent
.– pmg
4 de enero de 2017 a las 9:30
No relacionado con las advertencias del compilador, pero su malloc inicial es incorrecto; quieres:
malloc(sizeof(student *)* numStudents)
Para asignar espacio para un total de punteros ‘numStudents’ a un estudiante. La línea:
students[x] = (struct student*)malloc(sizeof(student));
Debiera ser:
students[x] = (student*)malloc(sizeof(student));
No existe tal cosa como ‘estudiante de estructura’. Ha declarado una estructura sin nombre y la ha definido como ‘estudiante’. Compara y contrasta con:
struct student
{
char* firstName;
char* lastName;
int day;
int month;
int year;
};
Lo que crearía un tipo de ‘estudiante de estructura’ pero requiere que usted (en C) se refiera explícitamente a estudiante de estructura en lugar de simplemente a estudiante en otro lugar. Esta regla se cambia para C++, por lo que su compilador puede estar un poco confuso al respecto.
Como para:
student* newStudent = {"john", "smith", 1, 12, 1983};
Eso debería ser:
student newStudent = {"john", "smith", 1, 12, 1983};
Como la sintaxis de llaves es un literal directo, no es algo que deba señalar en otro lugar.
EDITAR: reflexionando, creo que aaa puede haber tomado más de una descripción general de esto que yo. ¿Es posible que, sin darse cuenta, esté utilizando un nivel adicional de desreferencia de puntero en todas partes? Así que querrías:
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++;
Sujete la matriz que no se usa fuera del alcance de newStudent. De lo contrario, copiar los punteros a las cadenas es incorrecto.
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;
}
Al inicializar, ¿no debería ser así?
student** students = (struct student**)malloc(sizeof(student*)*numStudents);
Sin embargo, ¿por qué apuntar a un puntero? Solo con un puntero a la estructura es suficiente, creo.
Su código parece estar a mitad de camino entre la creación dinámica de una matriz de estructuras de estudiantes y la creación dinámica de una matriz de punteros a estructuras de estudiantes, y luego la creación dinámica de cada estructura de estudiante a la que se apunta. No es obvio cuál está tratando de hacer, lo que dificulta la respuesta.
–Pete Kirkham
13 de noviembre de 2010 a las 16:43