Ich kann auf den char-Wert der verschachtelten Struktur zugreifen, aber die int-Struktur zeigt nur die Speicheradresse an. Wie kann ich den Zeigerwert einer int-Struktur dereferenzieren? hier ist ein Beispielcode:
struct Student {
char firstname[10];
char lastname[10];
struct Class *class;
};
struct Class {
char name[10];
int cap;
};
void printStudents(struct Student *student) {
struct Class *class;
class = student->class;
printf("Capacity => %d\n", &class->cap);
printf("Class => %s\n", &class->name);
}
int main(void) {
struct Student student = {"Ian", "saeidi", {"rust", 24}};
printStudents(&student);
return 0;
}
Ausgabe:
Capacity => 34938800
Class => rust
Erwartete Ausgabe:
Capacity => 24
Class => rust
Lösung des Problems
Sie haben mehrere Probleme:
class
, daher ist der Versuch, es mit zu initialisieren, {"rust", 24}
falsch.name
ist es eine Single char
und kann weder eine Zeichenfolge halten noch darauf zeigen.class = student->class;
ungültiger class
Speicher zugewiesen, und die Dereferenzierung ( class->
) ruft undefiniertes Verhalten auf."%d"
printf
Der Formatbezeichner erwartet ein int
, aber Sie übergeben ihm einint*
"%s"
printf
Formatbezeichner erwarten ein char*
, aber Sie übergeben ihm ein char (*)[10]
(Zeiger auf ein char
Array der Größe 10).Eine mögliche Lösung:
// flip the order of the structs so you can declare a `struct Class class` in
// `struct Student` (no pointer)
struct Class {
// change this from a pointer to array
char name[10];
int cap;
};
struct Student {
char firstname[10];
char lastname[10];
struct Class class;
};
void printStudents(struct Student *student) {
// get a pointer to the address of student->class if you want
struct Class *class;
class = &(student->class);
// now things print appropriately
// pass an `int` to %d
printf("Capacity => %d\n", class->cap);
// pass a `char*` to %s. `class->name` in this context "decays" to a
// pointer to its first element, a `char`
printf("Class => %s\n", class->name);
}
int main(void) {
// now your initialization is valid
struct Student student = {"Ian", "saeidi", {"rust", 24}};
printStudents(&student);
return 0;
}
Sie können anstelle von Arrays auch die dynamische Speicherzuweisung verwenden.
Demonstration
Keine Kommentare:
Kommentar veröffentlichen