Umgang mit wiederkehrenden C-Strings

8

Was wird als bessere Methode angesehen, wenn Methoden geschrieben werden, die Zeichenfolgen in C zurückgeben?

übergibt einen Puffer und Größe:

%Vor%

oder machen und eine Zeichenfolge mit der richtigen Größe zurückgeben:

%Vor%

P.S. Was denkst du über das Zurückgeben des Puffers ptr, um Zuweisungsstil zu erlauben und verschachtelte Funktionsaufrufe, d. h.

%Vor%     
Roman A. Taycher 05.05.2011, 05:04
quelle

5 Antworten

5

Das Übergeben eines Puffers als Argument löst die meisten Probleme, mit denen dieser Codetyp umgehen kann.

Wenn es einen Zeiger auf einen Puffer zurückgibt, müssen Sie entscheiden, wie es zugewiesen wird und ob der Aufrufer für die Freigabe zuständig ist. Die Funktion könnte einen statischen Zeiger zurückgeben, der nicht freigegeben werden muss, aber dann ist sie nicht threadsicher.

    
Jonathan Wood 05.05.2011 05:08
quelle
3

Das Übergeben eines Puffers und einer Größe ist in der Regel weniger fehleranfällig, besonders wenn die Größe Ihrer Strings normalerweise eine "vernünftige" Größe hat. Wenn Sie Speicher dynamisch zuweisen und einen Zeiger zurückgeben, ist der Aufrufer dafür zuständig, den Speicher freizugeben (und muss daran denken, die entsprechende freie Funktion für den Speicher zu verwenden, je nachdem, wie die Funktion ihm zugewiesen wurde).

Wenn Sie große C-APIs wie Win32 untersuchen, werden Sie feststellen, dass praktisch alle Funktionen, die Zeichenfolgen zurückgeben, das erste Formular verwenden, bei dem der Aufrufer einen Puffer und eine Größe übergibt. Nur unter bestimmten Umständen können Sie die zweite Form finden, in der die Funktion den Rückgabewert zuweist (ich kann im Moment nicht an etwas denken).

    
Greg Hewgill 05.05.2011 05:07
quelle
1

Ich würde die zweite Option bevorzugen, da die Funktion entscheiden kann, wie groß ein Puffer ist. Oft ist der Anrufer nicht in der Lage, diese Entscheidung zu treffen.

    
David Heffernan 05.05.2011 05:07
quelle
1

Eine weitere Alternative zur Übergabe eines Puffer- und Größenstils mit einem Rückgabecode:

%Vor%

Ein Null-Return-Code zeigt an, dass der Puffer des Aufrufers geeignet war und ausgefüllt wurde.

Ein Rückgabecode & gt; 0 gibt an, dass der Puffer des Aufrufers zu klein war und zeigt die Größe an, die tatsächlich benötigt wird. Dadurch kann der Aufrufer die Größe seines Puffers ändern und es erneut versuchen.

    
Robert Groves 05.05.2011 05:41
quelle
0

Das Übergeben der Pufferadresse und -länge ist in den meisten Fällen am besten. Es ist weniger fehleranfällig und man muss sich keine Gedanken über Speicherlecks machen. Tatsächlich ist es in einigen eng eingebetteten Systemen völlig unerwünscht, den Heap zu verwenden. Die Funktion darf jedoch den Puffer nicht überschreiben, da dies das System zum Absturz bringen kann und, schlimmer noch, es für Hacker anfällig machen kann.

Die einzige Zeit, wo ich die Funktion gesehen habe, die zugewiesenen Puffer zurückgibt, ist die libxml-API, um XML-Text von xmlDoc zu generieren.

    
Manish 05.05.2011 06:08
quelle

Tags und Links