Warnung: Bitte behandle mich wie der Anfänger, der ich bin. Dies ist mein erstes "echtes" C-Programm. Also, wenn ich einige Dinge nicht verstehe, deshalb.
Ich versuche, einen Chatserver zu erstellen, der dem Beispiel von Beej's Guide zur Netzwerkprogrammierung folgt. Es kam empfohlen, also los gehts.
Ich möchte, dass eine Funktion einen Zeiger auf eine Struktur akzeptiert, Eigenschaften in diesem Zeiger ändert und einen Listener am übergebenen Port einrichtet. Im folgenden Code erhalte ich eine Segmentierungsfehler, und ich kann ehrlich nicht herausfinden, warum. Beschuldige, dass ich grün bin. (Entwickeln in Netbeans 6.8 auf Ubuntu, falls erforderlich):
%Vor%Wenn Sie den vollständigen Code benötigen (ich denke, ich habe alles Wichtige veröffentlicht), finden Sie unten einen Link. Vielen Dank im Voraus für jede Hilfe oder versuchen Sie es!
Die Zeile:
%Vor%reserviert tatsächlich keinen Platz für eine Serverstruktur, nur für einen Zeiger auf einen, der auf einen zufälligen Wert gesetzt ist.
Es sieht folgendermaßen aus:
%Vor%, die tatsächlich etwas Speicher für Sie zur Verfügung stellt.
Denken Sie an den Unterschied wie folgt:
%Vor% Das ist falsch. Hier fragen Sie memset
, den Speicher, auf den server
zeigt, auf Null zu setzen. Der Aufruf von memset
ist korrekt, es ist der Zeiger server
, der nicht korrekt ist. Diese Zeile:
Ordnet Speicher zu und gibt Ihnen einen Zeiger, aber er weist dem Zeigeobjekt keinen Speicher zu und gibt dem Zeiger keinen Anfangswert. Nach dieser Zeile zeigt der Zeiger also nur auf eine zufällige Stelle im Speicher. (Es wird wahrscheinlich verwendet, was im RAM übrig geblieben ist.) Wir haben ihm noch keinen gültigen Wert zugewiesen, daher ist es nicht zulässig, ihn an memset
zu übergeben.
Nun müssen wir ihm einen gültigen Wert geben. Du könntest entweder:
1) Weisen Sie Server
auf dem Stapel zu, indem Sie einfach sagen:
2) Weisen Sie Server
dynamisch zu, indem Sie malloc
:
(Beachten Sie auch die Verwendung von sizeof
- wenn Sie den Variablennamen anstelle des Typs verwenden, kann sizeof
angepasst werden, wenn Sie den Typ der Variablen ändern.)
Vielleicht möchten Sie ein grundlegendes Tutorial zu Zeigern finden und überprüfen. Dies ist ein ziemlich klassischer Fehler von jemandem, der zum ersten Mal einfach nur Zeiger aufgesammelt hat, also, fühle dich nicht so schlecht.