2011-01-03 12 views
0

Ich versuche, jemandes Code zu entschlüsseln, und ich sehe etwas, das ich nicht verstehe. Ich sehe keine Referenzen darüber, wie Strukturen angewendet werden, wenn Mitglieder nicht in der Kopfzeile oder am Anfang des Codes definiert sind, sondern später definiert werden. Hier ist ein Beispiel für das, was ich herausfinden möchte. Ich habe diese Data_t * Daten notiert; in der Kopfzeile ist nicht definiert, bis wir die Funky-Funktion eingeben und mein Compiler Fehler in dieser Zeile ausgibt. Ich denke, meine Frage wäre - ist dies ein gültiger Weg, Daten in Strukturen einzugeben?Strukturen initialisieren, ohne Elemente der Struktur zu definieren - C

Vielen Dank!

#include <stdio.h> 

typedef struct config{ 
    int a; 
    int b; 
    int c; 
    Data_t *data; 
} config_t; 

int funky(config_t *config); 

int main(void) 
{ 
    printf("In main()\n"); 
    config_t config; 
    funky(&config); 

    printf("a = %d\n", config.a); //accessing config's a member 

    return 0; 
} 

int funky(config_t *config) 
{ 
    printf("In funky()\n"); 

    Data_t *dataa = config->data; 
    for(i=0;i<5;i++){ 
     dataa[i].mem1=i; 
     dataa[i].mem2=4+i; 
    } 

    //Set values 
    config->a = 1; 
    printf("a = %d\n", config->a); //pointer to config's a member 

    return 0; 
} 

Antwort

2

Die Definition von Data_t in Ihrem Code nicht erscheint, das ist, was den Compiler-Fehler verursacht.

Auch - zu Ihrer spezifischen Frage, dieser Code dereferenziert einen nicht initialisierten Zeiger, der undefiniertes Verhalten verursacht. Initialisieren Sie das data Feld in der config Struktur in main, oder Sie werden in Schwierigkeiten sein. Dieser Codeblock:

Data_t *dataa = config->data; 
for(i=0;i<5;i++){ 
    dataa[i].mem1=i; 
    dataa[i].mem2=4+i; 
} 

Sind die schlechten Sachen - wie man sehen kann, kopiert es die unitialized Zeiger aus und versucht, Speicher durch, darauf zuzugreifen.

Der Code danach:

//Set values 
config->a = 1; 

in Ordnung ist, und ein völlig vernünftiger Weg, um eine Struktur zu initialisieren.

+0

Hallo Carl, Danke für die schnelle Antwort. Also, wenn ich das Datenfeld in der Konfigurationsstruktur in main initialisiere, sollte es in Ordnung sein, oder? Der Code, den ich als Referenz betrachte, sagt, dass sie in ihrem main() - Code etwas wie config.data = calloc (NUM, sizeof (Data_t)) gemacht haben; Ich verstehe nicht, wie der Compiler wissen würde, wie groß Data_t ist, wenn er nicht wirklich definiert ist. (?? O_O ??) Danke .. –

+0

Das sollte dich reparieren, ja. Es wird nicht den Compiler-Fehler beheben, da "Data_t" nicht definiert ist, aber vorausgesetzt, dass Sie dies geklärt haben, ist es auch wichtig, diesen Zeiger zu initialisieren. –

+0

Wie würden Sie Data_t definieren? Die Art, wie ich es sehe, wenn Sie Data_t definieren, d. H. Typedef struct dataS {int mem1; int mem2; } Data_t in der Kopfzeile oder in main, dann müssen Sie nicht Data_t * dataa = config-> data; in der funky Funktion. Was auf eine der früheren Fragen zurückgeht - ist es möglich, Mitglieder der Struktur in Funktionen zu definieren, wenn sie ein Mitglied bilden muss? –

Verwandte Themen