Struct pkt *packet und Struct pkt packet



  • Guten Tag Zusammen,

    bin relativ unvertraut mit C und versuche einen Code zu verstehen, daher wahrscheinlich eine relativ einfach Frage:

    Ich habe ein

    struct pkt {
    int seqn;
    int ackn;
    int chcksum;
    char payload[10];
    };

    (so wie ich das verstehe ist das nix anderes als ein sogenannter Typ, wie zum Beispiel int oder char etc.)

    Nun gibt es drei verschiedene Aufrufe mit diesem struct pkt:

    1.)

    struct pkt winbuf[4]
    

    Frage: ➡ Erzeugt das ein Array winbuf der Größe 4 des Typs pkt?

    2.)

    struct pkt *packet
    

    3.)

    struct pkt packet
    

    Frage: ➡
    Was passiert bei 2 und was bei 3? *packet ist das nun ein pointer?
    Hat *packet was mit packet zu tun wenn es vorher initialisiert wurde, oder sind in dem fall packet und *packet zwei verschiedene vaiablen (pointer und variable), circa so:

    void ChckCorr(packet)
      struct pkt *packet; 
       {int x...}
    

    Wenn dass der Fall ist dann verstehe ich die funktion nicht:
    int CheckCorrupted(packet)
    struct pkt packet;
    {...}

    Was bedeuted dann im weiteren Verlauf

    x=packet.seqn
    

    und

    x=packet->seqn
    

    ??
    ➡
    packet.seqn ist wahrscheinlich der wert von packet.seqn ?
    packet->seqn ist die adresse von packet.seqn ???

    Vielen Dank für jede Hilfe und Antwort



  • Hi,

    Frage: Erzeugt das ein Array winbuf der Größe 4 des Typs pkt?

    Jepp.

    struct pkt winbuf[4] = {0};
    	// Erzeugt ein Array mit vier Strukturen und initialisiert alle Elemente mit 0. 
    		// Es lassen sich vier verschiedene Strukturen und deren Elemente
    	// mit der Variable winbuf über den Index 0 bis 3 'ansprechen'.
    	winbuf[0].seqn = 1; // Das erste Element der ersten Struktur bekommt den Wert 1.
    	strcpy(winbuf[3].payload, "Hi Bruder!"); // Das letzte Element der letzten Struktur bekommt die Zeichenkette
    						//"Hi Bruder!" zugewiesen.
    

    Was passiert bei 2 und was bei 3? *packet ist das nun ein pointer?

    Jepp.

    Hat *packet was mit packet zu tun wenn es vorher initialisiert wurde,
    oder sind in dem fall packet und *packet zwei verschiedene vaiablen

    packet ist die Adresse und *packet ist die dereferenzierte Adresse.
    damit lassen sich z.B. ganze Structs kopieren:

    struct pkt* a, *b;
    	a = &winbuf[3]; // a hat die Adresse der letzten (vierten) Struktur
    	b = &winbuf[0]; // b hat die Adresse der ersten Struktur.
    
    	*b = *a; // Der Inhalt der letzten Struktur wird in die erste kopiert.
    		zeig_struktur(b);
    

    circa so:
    void ChckCorr(packet)

    Hier fehlt der Typ

    void ChckCorr(struct pkd packet) 
    //	oder
    	void ChckCorr(struct pkt packet)
    

    Was bedeuted dann im weiteren Verlauf
    x=packet.seqn

    Hier ist packet eine Variable ( siehe oben ).

    x=packet->seqn

    Hier ist packet ein Zeiger ( siehe oben ).

    Ruhig mal ein bisschen experimentieren und die Elemente anzeigen lassen:

    void zeig_struktur ( struct pkt* p )
    {
    	if (p)
    		printf ( "%d %d %d %s\n",  p->seqn, p->ackn, p->chcksum, p->payload );
    }
    

    Gruß,
    B.B.



  • Booyeoo schrieb:

    packet.seqn ist wahrscheinlich der wert von packet.seqn ?
    packet->seqn ist die adresse von packet.seqn ???

    Bei packet.seqn hat man eine Struktur packet mit dem Element seqn.
    Wenn man nun nur einen Zeiger auf die Struktur hat muss man ihn erst dereferenzieren um an ihn ranzukommen.

    struct pkt p1; //struktur
    p1.seqn; //strukturelement
    
    struct pkt *p2; //zeiger auf struktur
    *p2; //zeiger dereferenziert, man bekommt die struktur
    *p2.seqn; //funktioniert nicht wegen vorrangregeln, . bindet stärker als *
    (*p2).seqn; //funktioniert, ist aber umständlich
    p2->seqn; //kurzschreibweise für (*p2).seqn
    
    &p1; //adresse von p1, also ein Zeiger
    (*(&p1)); //die adresse von p1 und davon das objekt auf das diese adresse zeigt. Ist natürlich p1 selbst
    

    Ich hoffe es ist klarer geworden und ich habe mich nicht vertippt.



  • Wunderbar,

    habe dank euch und google die Sache der Deferenzierung mit . und -> jetzt ausreichend verstanden.

    Ein Sache die mir noch ein wenig Sorgen bereitet ist die Tatsache mit dem Typ:

    Hier fehlt der Typ

    Ich poste nochmal die beiden Funktionsheader:

    void funktionsname(packet) struct pkt *packet;{...}
    

    und

    int funktionsname(packet) struct pkt packet;{...}
    

    Und so wie ich Dich jetzt verstehe müsste das (packet) was in den runden Klammern steht eigentlich einen Typ haben. Hat es aber nicht, es läuft aber trotzdem... ist C da sehr tolerant oder ist das hier eine Ausnahme?

    Grüße und vielen Dank 🙂 👍



  • Das ist eine Deklaration nach altem K&R Stil.

    Gruß,
    B.B.



  • Big Brother schrieb:

    Das ist eine Deklaration nach altem K&R Stil.

    Ich fange an C zu verstehen.

    Case Closed 👍


Anmelden zum Antworten