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.