Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

mal eine kurze Frage von Zeigerübergaben von Strukturen.

Und zwar geht es um folgendes:

Die Funktion "bind()" verlangt folgendes:

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

Die Adressen und Ports definiere ich aber in der Struktur : "sockaddr_in".

Beim Aufruf der Funktion bind funktioniert es wenn ich einen Zeiger auf die Adresse von der Struktur sockaddr_in mache.

Also so:


struct sockaddr_in srv;

connect (sockfd, (struct sockaddr *) &srv, sizeof(srv)) ;

Versuche ich es aber vorher in einen Zeiger der structur sockaddr auf die structur sockaddr_in zeigen zu lassen geht es nicht:

struct sockaddr_in srv;

struct sockaddr *psrv;


psrv = &srv;

connect (sockfd, psrv, sizeof(srv)) ;

Dann meckert der Compiler nämlich (was ja auch richtig ist....):

""test1.c", line 15.7: 1506-068 (W) Operation between types "struct sockaddr*" and "struct sockaddr_in*" is not allowed."

Warum funktioniert es aber in der ersten Lösung?

Habe ich irgendwo einen Denkfehler?

Danke :)

Weil du es in der 1. Lösung in einen anderen Typ castest und dem Compiler damit sagst das das so auf alle Fälle past. Beim 2. machst du das nicht.

hmm ok, aber wie kriegt er das dann intern hin? er muss die struktur-inhalte doch irgendwie umkopieren oder zeiger auf die inhalte machen?

Gibt es dazu vllt. irgendwo mal ne schöne FAQ?

Danke :)

Ja nennt sich MSDN

Nein ich meinte wie so ein casten verschiedener structuren im genauen funktioniert..

Also wie er die Typumwandlung macht :)

Es passiert keine Umwandlung. Es wird nur kopiert ohne das der Compiler prüft ob das überhaupt so passt.

d.h. er kopiert nur die felder die es in der 2ten structur auch gibt?

Nein er kopiert die Adresse einer Struktur sockaddr_in in einen Zeiger vom Typ sockaddr. Die Struktur selber bleibt unberührt.

ok ungünstig ausgedrückt und was passiert mit den feldern die in der struct sockaddr nicht vorhänden wären/sind?

oder zeigt er trotzdem weiter auf die felder (von sockaddr_in) obwohl diese in der structur (sockaddr) vom zeiger gar nicht mehr vorhanden sind?

Der Zeiger psrvzeigt genau auf den selben Speicherbereich wie srv. Es wird jetzt lediglich anders interpretiert.

ok damit habe ich atm ein bischen verständinissprobleme...

er wird als sockaddr interpetiert, aber ich kann trotzdem noch die gleichen "speicherbereiche"(=strukturfelder) wie in sockaddr_in ansprechen?

Zusammengefasst: ich gaugle dem compiler eigentlich etwas vor obwohl der speicherbereich eigentlich die "formatierung" von sockaddr_in hat?

Ja. Guck dir den Link an den ich oben gepostet habe dann sollte das klarer werden.

ok nu is klar :)

Danke :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.