hallo! Ich bin gerade dabei, mich in die TCP/IP Socket Programmierung einzuarbeiten (TCP/IP Socket in C). Gleich am Anfang ist ein Codefragment als allgemeines (nicht mit TCP/IP zu tun)Beispiel angebracht und ich kapiere es einfach nicht, was dieser Codefragment macht. Kann mir da jemand helfen? #include <stdio.h> #include <stdlib.h> int main(void) { typedef struct { int a; short s[2]; }MSG; int count = 0; MSG *mp, m={6,8,5}; char *fp, *tp; mp = (MSG*)malloc(sizeof(MSG)); Bis hierhin komme ich klar. Die nächste Zeile ist aber unklar. OK, ich denke, dass fp eben auf das Zeichen zeigt, das in m.s liegt. Nun dachte ich, dass m.s = m.s[0] ist, weil ja ein Array ohne Index ein Zeiger auf das erste Element des Arrays ist. Offensichtlich ist das nicht so. Warum? Und (char*)mp->s? mp ist doch einfach ein zeiger auf eine Struktur vom Typ MSG, aber mp wurde doch keine konkrete Struktur zugewiesen. Worauf zeigt dann (char*)mp->s? Und eine generelle Frage: was bedeutet eigentlich diese Konstruktion (char*)m.s? Warum ist char* in Klammern? for(fp = (char*)m.s, tp=(char*)mp->s, count=0; count<4;count++) { if(count==0) { printf("\nfp = %c (%d)", fp, fp); printf("\ntp = %c (%d)", tp, tp); } *tp++ = *fp++; printf("\nfp = %c", fp); printf("\ntp = %c", tp); } return 0; } Es wäre echt cool, wenn mir das jemand erklären könnte. Ich sitzte schon seit Stunden daran und versuche es zu kapieren. Please!
> Und eine generelle Frage: > was bedeutet eigentlich diese Konstruktion (char*)m.s? Warum ist char* > in Klammern? Heißt typecast. Sagt also dem Compiler als was für einen Typ er die Variable behandeln soll. Schön zu sehen beim obigen malloc, wo aus void ein MSG wird.
1. wenn du dir den oberen Teil des Quellcodes anschaust siehst du, dass fp ein Zeiger auf ein char ist. m ist vom Typ MSG und das s darin ein Zeiger auf ein short-Array. Würdest du nun in der for-Schleife das (char*) weglassen, dann müsste der Compiler meckern, dass er einem char-Zeiger keinen short-Zeiger zuweisen kann. Du musst dem Compiler also sagen, dass er den short-Zeiger als char-Zeiger interpretieren soll und das machst du mit dem typecast (char*). 2. ob du bei dem Zugriff auf den Inhalt eines structs einen . oder -> benutzen musst, hängt davon ab, ob es sich direkt um die Struktur oder um einen Pointer auf die Struktur handelt. Bei der Struktur selbst wird ein Punkt verwendet, bei einem Pointer auf die Struktur ein ->.
In der for_Schleife werden 4 (=> count) Bytes umkopiert und es wird ein Primitiv-Debug gemacht (printfs). Quelle der Kopieraktion ist das s Element einer bestehende MSG Struktur und der Quellpointer heisst fp. Da s ein Array (Feld) ist kann fp ohne Adressoperator initialisiert werden > fp = &(m.s[0]) oder m.s Da m.s[] ein short Array ist, fp aber ein char *, wird ein Cast verwendet. Ziel der Kopieraktion ist das s Element in einer neu mit malloc angelegten MSG-Struktur, auf die der Pointer mp zeigt. Der Zielpointer tp kann so initialisiert werden > tp = &((*mp).s[0]) oder (*mp).s oder mp->s Dazu wieder dann wieder der Cast.
Vielen vielen Dank, Leute! Super, dass Ihr so schnell geantwortet habt. Ihr habt mir wirklich geholfen. Euch allen noch einen schönen Sonntag! Anna
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.