2016-07-22 14 views
1

Ich versuche, Verweis eine (verschachtelte) Struktur in C.C vorwärtsgerichtete Strukturen - 1) muss mit einem Zeiger sein? 2) muss initialisiert werden?

Das bedeutet, ich habe eine Struktur und darin verweise ich auf eine andere Struktur, die später deklariert wird.

Wenn ich die verschachtelte Struktur als Zeiger deklariere und mit Werten initialisiere, funktioniert es.

Der folgende Code funktioniert:

#include <stdio.h> 

struct computer{ 
    double cost; 
    int year; 
    char cpu_type[16]; 
    struct cpu_speed *sp; //this is the question (1) 
}; 

struct cpu_speed{ 
    int num; 
    char type[16]; 
}; 

typedef struct computer SC; 
typedef struct cpu_speed SS; 

void DataR(SC *s); 
void DataP(SC *s); 

int main(){ 
    // this is question (2) 
    SS speed = {4,"giga"};  
    SC model[2] = { 
    { 0,1990, "intel", &speed}, 
    { 0,1990, "intel", &speed} 
    }; 

    int i; 
    for(i=0;i<2;i++) { 
     printf("computer no. %d \n", i+1); 
     DataR(&model[i]); 
    } 
    printf("here's what you entered: \n"); 
    for(i=0;i<2;i++) { 
     printf("computer no. %d \n", i+1); 
     DataP(&model[i]); 
    } 
    return 0; 
} 

void DataR(SC *s){ 
    printf("the cost of your computer: "); 
    scanf("%lf", &s->cost); 
    printf("the year of your computer: "); 
    scanf("%d", &s->year); 
    printf("the type of cpu inside your computer: "); 
    scanf("%s", s->cpu_type); 
    printf("the speed of the cpu: "); 
    scanf("%d %s", &(s->sp->num), s->sp->type); 

} 

void DataP(SC *s){ 

    printf("the cost: %.2lf\n",s->cost); 
    printf("the year: %d\n",s->year); 
    printf("the cpu type: %s\n",s->cpu_type); 
    printf("the cpu speed: %d %s\n",s->sp->num, s->sp->type); 
} 

Wenn ich die verschachtelte Struktur (dh struct cpu_speed{...};), bevor die Mutter erklären struct, ich brauche keinen Zeiger zu verwenden, und ich auch nicht brauchen (?) initialisieren.

Bedeutung:

(1) kann ich struct cpu_speed speed; statt struct cpu_speed *sp; verwenden. (2) Ich muss den Strukturvariablen keine initialisierten Werte geben.

Meine Fragen noch einmal - in Vorwärtsreferenzierung Struktur - (1) müssen Sie es mit einem Zeiger deklarieren? und (2) müssen Sie die Werte initialisieren?

+0

Denken Sie einfach: Wie würde ein rekursives 'struct' funktionieren? (Während es verwandt ist, geht es hier nicht um Verschachtelung) – Olaf

Antwort

5

Strukturen werden nur vom Compiler verwendet, um Ihren Speicher auszurichten. Daher muss es die Größe von Strukturelementen kennen.

struct foo { 
    struct bar *pointer; 
}; 

In diesem Fall ist die sizeof(pointer) in keinem Zusammenhang mit der bar Struktur und damit der Compiler nicht mehr, etwas zu wissen braucht.

Wenn Sie jedoch die Struktur bar der Struktur foo hinzufügen möchten, muss sie über ihre einzelnen Mitglieder wissen.

struct bar { 
    const char *string; 
    uint64_t integer; 
}; 

struct foo { 
    struct bar sub; 
}; 

Sie müssen die bar Struktur vor foo erklären, da der Compiler muss wissen, was Sie sich beziehen. Wie sonst würde es wissen, was mit diesem (illegalen) Code zu tun ist:

struct bar { 
    struct foo sub; 
}; 

struct foo { 
    struct bar sub; 
}; 
+0

ok, also sollten Sie im Grunde keine vorwärtsgerichteten Strukturen verwenden, und wenn Sie das tun - müssen Sie Zeiger verwenden und diese initialisieren. Ist das korrekt? –

+0

Nun, mit vorwärtsgerichteten Strukturen ist nichts falsch. Zum Beispiel ist es großartig, wenn Sie diese verwenden, um Strukturelemente vor öffentlich zugänglichen APIs zu schützen. Aber wenn Sie das tun, müssen Sie immer Zeiger und "malloc" verwenden, um eine neue Instanz zu erstellen, ja. – elslooo