Was macht dieser Codefragment

OP #1122783
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!
Gast #1122788
> 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.
Gast #1122907
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 ->.
Persönliche Seite #1122915
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.
Gast #1123150
Vielen vielen Dank, Leute! Super, dass Ihr so schnell geantwortet habt. 
Ihr habt mir wirklich geholfen. Euch allen noch einen schönen Sonntag!

Anna

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.