Zum Inhalt springen

Struktur - Zeiger / Konvertierung?


Empfohlene Beiträge

Geschrieben

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 :)

Geschrieben
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 :)

Geschrieben
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?

Geschrieben
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?

Geschrieben
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?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...