Pointer auf verschachtele Strukturen



  • Hallo, folgendes Problem

    typedef struct
    		{char szName[20];
    		float afNoten[4];
    		}TStud;
    
    typedef struct tEle
    		{struct tEle *pNext;
    		TStud stud;
    		}TEle;
    

    mit Tele pRoot* = NULL

    und möchte nun erstmal ein struct vom Typ Tstud machen:

    TStud neu = {"Chris", 3.0, 4.0, 3.0, 4.0};
    

    Erste Warnung:

    ..\src\SS2013 Aufgabe 2.c:28: warning: missing braces around initializer
    ..\src\SS2013 Aufgabe 2.c:28: warning: (near initialization for 'neu.afNoten')
    

    Und möchte nun dieses struct TStud neu vollständig an Tstud stud übergeben.

    Also

    pRoot->stud = neu;
    

    Nun möchte ich z.B. die namen vergleichen:
    Annahme:

    char *Name ="Chris";
    
    strcmp(Name,proot->stud.szName);
    

    2te Warnung zu strcmp:

    ..\src\SS2013 Aufgabe 2.c:34: warning: statement with no effect
    

    Was mache ich falsch?

    Vielen Dank im voraus!

    zoro


  • Mod

    zoro schrieb:

    Erste Warnung:

    ..\src\SS2013 Aufgabe 2.c:28: warning: missing braces around initializer
    ..\src\SS2013 Aufgabe 2.c:28: warning: (near initialization for 'neu.afNoten')
    

    Ein Array ist auch ein zusammen gesetzter Datentyp und will daher seine eigenen geschweiften Klammern bei der Initialisierung. Du musst also die Klammern schachteln:

    TStud neu = {"Chris", {3.0, 4.0, 3.0, 4.0}};
    

    Es sollte auch ohne die Klammern funktionieren, aber mit ist es richtig.

    Und möchte nun dieses struct TStud neu vollständig an Tstud stud übergeben.

    Also

    pRoot->stud = neu;
    

    Ob das so eine gute Idee ist, wenn pRoot = NULL ist?

    Annahme:

    char *Name ="Chris";
    

    Der Compiler meckert hier zwar nicht, aber besser wäre

    const char *Name = "Chris";
    

    Zeichenkettenliterale sind an sich zwar nicht const-qualifiziert, aber Änderungen an solchen sind trotzdem undefiniertes Verhalten (und werden in der Regel einen Segfault auslösen) und sollten daher verhindert werden.

    strcmp(Name,proot->stud.szName);
    

    2te Warnung zu strcmp:

    ..\src\SS2013 Aufgabe 2.c:34: warning: statement with no effect
    

    Du vergleichst die beiden zwar, aber tust halt nichts mit dem Ergebnis des Vergleichs. Das heißt, der ganze Ausdruck macht viel Arbeit für nichts.



  • Danke für die schnelle antwort.

    wäre besser:

    pRoot = malloc(sizeof("struct"));
    

    und dann:

    pRoot->stud = neu;
    

    Danke im voraus!



  • zoro schrieb:

    pRoot = malloc(sizeof("struct"));
    
    TEle *pRoot = malloc( sizeof *pRoot );
    

    Später bitte brav mit free() wieder freigeben ...



  • Selbstverständlich 🙄

    😃



  • was soll sizeof("struct") bei deinem Malloc bitte machen?



  • Sollte nur bedeuten das dort ein bestimmtes struct von iwas drinnen steht, da ja hier die größe des zu belegenden speichers verlangt wird^^


Anmelden zum Antworten