Forum: PC-Programmierung Was macht dieser Codefragment


von Anna R. (njutik)


Lesenswert?

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!

von Malte (Gast)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Anna Richter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.