Pointer auf Wert in struct



  • Moin

    habe mich gerade tot gegoogelt aber verstehe es nicht.

    Localtime möchte auf eine Adresse zeigen können, in der sie rumfuhrwerkt.

    struct tm * localtime (const time_t * timer);
    

    Ich verstehe nur nicht warum der Adressoperator & bei Test.start nicht greift.
    Beide sind vom Typ tm;

    typedef struct  {
    	struct tm start;
    	struct tm end;
    } test_t;
    
    test_t Test;
    time_t t;
    
    &Test.start = localtime(&t); // Fehler bei der Zuweisung (error: invalid lvalue in assignment)
    


  • Sharki schrieb:

    typedef struct  {
    	struct tm start;
    	struct tm end;
    } test_t;
    
    test_t Test;
    time_t t;
    
    &Test.start = localtime(&t); // Fehler bei der Zuweisung (error: invalid lvalue in assignment)
    

    Das hat mit localtime nichts zu tun, du versuchst einer Adresse (= eine vom Compiler festgelegte Konstante) irgendwas zuzuweisen. Das macht nicht unbedingt Sinn, du kannst entweder den Rückgabewert einem Zeiger auf struct tm zuweisen oder ihn direkt dereferenzieren und einer Variable vom Typ struct tm zuweisen:

    struct tm* ptr = localtime(&t);
    struct tm T = *localtime(&t);
    

    Du brauchst offensichtlich das zweite. Das erste ist so oder so fragwürdig, weil das Objekt hinter dem Zeiger statisch ist und beim nächsten localtime-Aufruf ungültig wird.



  • Das hat mit localtime nichts zu tun, du versuchst einer Adresse (= eine vom Compiler festgelegte Konstante) irgendwas zuzuweisen. Das macht nicht unbedingt Sinn, du kannst entweder den Rückgabewert einem Zeiger auf struct tm zuweisen oder ihn direkt dereferenzieren und einer Variable vom Typ struct tm zuweisen:

    struct tm* ptr = localtime(&t);
    struct tm T = *localtime(&t);
    

    Du brauchst offensichtlich das zweite. Das erste ist so oder so fragwürdig, weil das Objekt hinter dem Zeiger statisch ist und beim nächsten localtime-Aufruf ungültig wird.

    Danke das war es aber ich habe es nicht richtig Verstanden. Das localtime damit nichts zu tun hat war mir klar.

    Wenn ich eine Adressvariable übergebe z.B an localtime geht das mit z.B. (time_t t) &t. Jetzt möchte localtime sein Ergebnis an einer Adresse des Typs tm ablegen. Warum geht hier der Adressoperator nicht und der dereferenz operator * (richtig oder ???).
    Ich habe da einen Knoten in meinen Hirnzellen. Oder ich steige immer noch nicht hinter die Pointer.



  • localtime gibt eine Adresse zurück. Da wo sich das Objekt befindet.
    Dein Test.start hat aber schon eine feste, nicht änderbare Adresse.


  • Mod

    Du kannst nicht die Adresse von etwas ändern. Daher kann man dem Ergebnis des Adressoperators nichts zuweisen. Das ist eine Konstante.

    localtime möchte sein Ergebnis nicht "an eine Adresse vom Typ tm schreiben" (abgesehen davon, das Adressen keinen Typ haben, sondern nur Pointer), es schreibt sein Ergebnis bereits in ein struct tm und möchte dir hinterher einen Zeiger auf dieses struct zurück geben, so dass du auf das Ergebnis zugreifen kannst. Dann kannst du über diesen Zeiger auf das Ergebnis zugreifen, eben indem du den Zeiger dereferenzierst. Dann kannst du unter anderem auch eine Kopie davon machen.

    (Dieses Design von localtime ist problematisch und würde heutzutage sicher nicht mehr so gemacht, wenn man die Standardbibliothek neu designen würde. In den 1970er Jahren hatte man eben andere Prioritäten.)



  • DirkB schrieb:

    localtime gibt eine Adresse zurück. Da wo sich das Objekt befindet.
    Dein Test.start hat aber schon eine feste, nicht änderbare Adresse.

    Ok eben ist der Groschen gefallen. Danke.


Log in to reply