Sie haben zwei Probleme:
Der Zeiger receiveddata
nicht initialisiert ist und somit zeigt auf einige zufällige Stelle im Speicher. Dies führt dazu, dass Sie irgendwo Daten löschen.
Die Änderung, die Sie an den Zeiger buffer
vornehmen, wird nicht nach außen weitergegeben. Wenn Sie dies tun möchten, müssen Sie einen Doppelzeiger verwenden.
Hier ist eine Lösung für beide Probleme:
void doSomething(unsigned char **buffer)
{
unsigned char* receiveddata;
// Allocate memory
// Note: You need to know the maximum length of data that you will
// ever receive here.
receiveddata=new unsigned char[MAXIMUM_NUMBER_OF_CHARS_YOU_WILL_RECEIVE];
Socket.recv(receiveddata);
*buffer = receiveddata;
printout(buffer);
}
Beachten Sie, dass dieser Code zu einem Pufferüberlauf-Angriff, falls jemand anfällig ist, kann es mehr Daten senden, als Sie erwarten. Welche Socket-Bibliothek verwenden Sie? Verfügt sie über einen Mechanismus, der Sie davor schützen kann, mehr Daten in den Puffer zu schreiben, als es möglich ist (z. B. ein zusätzliches Argument, um die Länge des Puffers anzugeben)?
Sie würden dies nennen wie folgt:
unsigned char* buffer;
doSomething(&buffer);
// Process the data in buffer, then free it when you're done:
delete [] buffer;
jedoch, wie andere haben darauf hingewiesen, es ist umständlich Speicherzuweisung und Löschen selbst zu verwalten. Sehen Sie sich die Standardbibliothek und die darin enthaltenen String- und Collection-Klassen an - diese können das Leben einfacher und sicherer machen, indem Sie die Speicherverwaltung für Sie übernehmen.
Bearbeitet wie in den Kommentaren notiert.
Warum ist das mit "C++" markiert? Es ist reiner C-Code. Und es enthält eine Reihe von Fehlern, die C++ verhindern soll. – sbi
Nein, ist es nicht. Er ruft die recv() - Methode eines Objekts namens Socket auf. Das kannst du nicht in C machen. –
@Neil: Du hast sicherlich Recht, ich habe übersehen, dass dieser Aufruf C++ ist. Aber warum sollte reines C um diesen Aufruf geschrieben werden, wodurch das Ressourcenmanagement so durcheinander gebracht wird, dass das OP eher eine Sprache verwenden sollte, die kein manuelles Ressourcenmanagement erfordert? – sbi