sayso Geschrieben 2. November 2005 Geschrieben 2. November 2005 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 Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 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. Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 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 Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 Ja nennt sich MSDN Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 Ja nennt sich MSDN Nein ich meinte wie so ein casten verschiedener structuren im genauen funktioniert.. Also wie er die Typumwandlung macht Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 Es passiert keine Umwandlung. Es wird nur kopiert ohne das der Compiler prüft ob das überhaupt so passt. Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 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? Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 Nein er kopiert die Adresse einer Struktur sockaddr_in in einen Zeiger vom Typ sockaddr. Die Struktur selber bleibt unberührt. Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 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? Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 Der Zeiger psrvzeigt genau auf den selben Speicherbereich wie srv. Es wird jetzt lediglich anders interpretiert. Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 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? Zitieren
Guybrush Threepwood Geschrieben 2. November 2005 Geschrieben 2. November 2005 Ja. Guck dir den Link an den ich oben gepostet habe dann sollte das klarer werden. Zitieren
sayso Geschrieben 2. November 2005 Autor Geschrieben 2. November 2005 Ja. Guck dir den Link an den ich oben gepostet habe dann sollte das klarer werden. ok nu is klar Danke Zitieren
Empfohlene Beiträge
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.