Was nützt der Rückgabewert memset ()?


88

memset()wird als Rückgabe deklariert, void*die immer den gleichen Wert hat wie die an die Funktion übergebene Adresse.

Was nützt der Rückgabewert? Warum kehrt es nicht zurück void?



2
Was nützt der Rückgabewert von strcat()? Manchmal sind Standardfunktionen so, wie sie angegeben sind, nicht so, wie sie sein sollten.
DevSolar

4
@MatthieuM.: Außerdem sind mit der Rücksendung von Sachen im Allgemeinen Kosten ungleich Null verbunden. Selbst wenn der Rückgabewert in ein Register passt, müssen Sie diesen Wert im Allgemeinen in das Register laden. Dies hat jedoch geringe Kosten.
NPE

15
@sharptooth: Eine Funktion "Alle Menschen töten" würde natürlich die Anzahl der getöteten Menschen zurückgeben.
Indiv

2
@MatthieuM.: Sie würden sich über solche Kleinigkeiten keine Sorgen machen, aber ich könnte es auf jeden Fall . Was ist, wenn ich einen Compiler für ein System mit begrenzten Ressourcen schreibe? Hmmm?
Thomas Eding

Antworten:


34

Die Signatur ist im Einklang mit allen anderen ähnlichen Funktionen: memcpy(), strcpy()etc. Ich habe immer gedacht , dies getan wurde eine Kette Anrufe zu solchen Funktionen zu aktivieren und zu verwenden , sonst solche Anrufe in Ausdrücken.

Trotzdem bin ich nie auf eine reale Situation gestoßen, in der ich mich gezwungen fühlen würde, den Rückgabewert so zu verwenden.


121

Es kann für die Anrufverkettung verwendet werden wie:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
Ja, es ist definitiv der Anwendungsfall "Verketten".
Cartesius00

6
Ich habe die Antwort positiv bewertet, weil es ein interessanter Fall ist. Aber im wirklichen Leben denke ich, ist es besser, die Memset- und Strcpy-Aufrufe getrennt zu halten.
Tsvetomir Dimitrov

24
C-Programmierer lieben unlesbaren Code, daher ist das Ermöglichen einer unendlichen Verkettung ein Muss beim Entwerfen einer Standardfunktion.
Chad Schouggins

@ChadSchouggins Lesen Sie etwas Haskell-Code und Sie wissen, dass C-Programmierer eigentlich ziemlich wörtlich sind;) (denkt an Regex "Operator" = ~) ...
BitTickler

In diesem Beispiel wäre es natürlich auch umgekehrt sinnvoller gewesen, strcpyden Zeiger nach dem zuletzt kopierten zurückzugeben. memset(my_strcpy(a, "bla"), 0, a + 200);(wie std::copy_nund std::fill_nin C ++).
alfC

12

Um die Funktion als Argument für eine andere Funktion wie z sprintf


0

Ich bin auf diese Frage gestoßen, als ich gegoogelt habe, um zu sehen, welches Memset zurückgekehrt ist.

Ich habe einen Code, in dem ich auf einen Wert teste. Wenn dies wahr ist, prüfen Sie, ob ein Wert Null ist.

Da es in C keine vollständig portable Möglichkeit gibt, auf Nullen zu testen, muss ich memset in der Mitte ausführen.

Mein Code lautet also:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Dies spricht für den in den vorherigen Fragen aufgeführten Verkettungszweck, ist jedoch ein Beispiel für eine Verwendung dieser Technik.

Ich überlasse es anderen zu beurteilen, ob dies eine gute Codierung ist oder nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.