zeiger auf array von strukturen



  • hallo.

    ich habe folgende funktion

    int init(...) {
    
    	static struct meine (*opt);
    ...
    
    	if (opt == NULL)
    		opt = {
                        { 1, 2, 3, 4 },
                        { 5, 6, 7, 8 },
                        { 9, 0, 11, 12 }
                    }
    ...
    }
    

    die funktion init() soll nur beim ersten durchlauf opt, einen zeiger auf ein array von meine-structs, initialisieren. ich habe *opt static deklariert in der hoffnung, dass der compiler den zeiger mit NULL initialisiert und mein folgendes if() funktioniert. nun habe ich aber einen syntaxfehler: mein gcc 3.2.3 meldet mir in der zeile 'opt = {' vor dem '{' einen syntaxfehler. ich gehe stark davon aus, dass die deklaration 'static struct meine (*opt)' keinen zeiger auf ein array von structs erstellt. koennt ihr mir sagen, wie ich einen solchen zeiger deklariere? ich habe in meiner literatur nachgelesen - hab's aber offensichtlich nicht vertsanden...

    Gruss
    caspar



  • Hast du das noch nicht probiert?

    int init(...) {
        static struct meine opt[] = {
            { 1, 2, 3, 4 },
            { 5, 6, 7, 8 },
            { 9, 0, 11, 12 }
        };
        /* .... */
    }
    

    Fakt ist, dass die Initialisierung mit { ... } eben nur eine solche ist und kein Ausdruck. D.h. sie ist ausschliesslich mit einer Definition zusammen verwendbar, nicht z.B. auf der rechten Seite einer Zuweisung.



  • achso. ich wollte dieses array nur beim ersten funktionsaufruf initialisieren, daher habe ich es erst deklariert um es in if() auf eine definition zu pruefen und entsprechend zu initialisieren.
    naja, dann muss ich eben ein flag benutzen um zu speichern, ob das array schon initialisiert wurde.



  • Das Array wird so beim Start des Programms initialisiert. Reicht das nicht?



  • Wenn du das Array static machst, dann wird es auch nur einmal initialisiert!



  • nur einmal initialisiert? bei jedem weiteren funktionsaufrauf keine erneute initialisierung? das klingt gut 😃 - so wollte ich das. wusste nicht, dass static variablen nur einmal initialisiert werden.



  • 🙄
    Wenn das nicht so wäre, dann wären static variablen sinnlos. Die Variable soll schließlich ihren letzten Wert behalten bis zum nächsten Funktionsaufruf.

    Beispiel:

    int zaehler(void)
    {
       static int zahl = 0; //Wird mit 0 nur beim ersten Funktionsaufruf initialisiert
    
       printf("%d", ++zahl); //zählt bei jedem Funktionsaufruf die zahl um eins nach oben und gibt sie aus.
    
       return(zahl);
    }
    

    Probiers einfach mal aus und ruf zaehler() ein paar mal auf.



  • achso. dann befinden sich static variablen auch nicht auf dem stack, sondern werden gleich zu programmbeginn initialisert [und laut Helmut Herold unter linux in einem teil des speichers, der als data segment] und die initialisierung wird nicht erst zum funktionsaufruf vorgenommen. stimmt das?
    dass static variablen ihren wert behalten, wusste ich, dachte eben nur, dass der programmierer dafuer verantwortlich ist, dass keine zweite initialisierung vorgenommen wird.



  • Caspar schrieb:

    achso. dann befinden sich static variablen auch nicht auf dem stack, sondern werden gleich zu programmbeginn initialisert

    Nein. sie werden dann initialisiert, wenn sie 'gebraucht' werden.

    dass static variablen ihren wert behalten, wusste ich, dachte eben nur, dass der programmierer dafuer verantwortlich ist, dass keine zweite initialisierung vorgenommen wird.

    was hätte das für einen Sinn?



  • Shade Of Mine schrieb:

    Caspar schrieb:

    achso. dann befinden sich static variablen auch nicht auf dem stack, sondern werden gleich zu programmbeginn initialisert

    Nein. sie werden dann initialisiert, wenn sie 'gebraucht' werden.

    Warum sollte das so sein? Dann müsste bei jedem Funktionsaufruf getestet werden, ob die Variable schon initialisiert worden ist. Hint: Es geht um C, nicht um C++.



  • Bashar schrieb:

    Fakt ist, dass die Initialisierung mit { ... } eben nur eine solche ist und kein Ausdruck. D.h. sie ist ausschliesslich mit einer Definition zusammen verwendbar, nicht z.B. auf der rechten Seite einer Zuweisung.

    Wobei `opt = (struct meine[]){ { 1, 2, 3, 4 } };' funktionieren sollte (C99, compound literals).


Anmelden zum Antworten