GOOGLE ADS

Sonntag, 1. Mai 2022

Greifen Sie auf den int-Wert der verschachtelten Struktur in C zu

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:

  • Sie weisen keinen Speicherplatz für zu class, daher ist der Versuch, es mit zu initialisieren, {"rust", 24}falsch.

  • Auch wenn das in Ordnung war, nameist es eine Single charund kann weder eine Zeichenfolge halten noch darauf zeigen.

  • Da die Initialisierung falsch ist, wird class = student->class;ungültiger classSpeicher zugewiesen, und die Dereferenzierung ( class->) ruft undefiniertes Verhalten auf.

  • "%d" printfDer Formatbezeichner erwartet ein int, aber Sie übergeben ihm einint*

  • "%s" printfFormatbezeichner erwarten ein char*, aber Sie übergeben ihm ein char (*)[10](Zeiger auf ein charArray 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

    Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

    Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...