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 vaiablenpacket 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.seqnHier 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