Definition: Setzt die ersten num Bytes des Speicherblocks, auf den ptr zeigt, auf den angegebenen Wert (interpretiert als unsigned char).
Bedeutet dies, dass ein Wert in einer Speicheradresse fest codiert ist?
memset(&serv_addr,0,sizeof(serv_addr) ist das Beispiel, das ich versuche zu verstehen.
Kann das bitte jemand SEHR vereinfacht erklären?
Es wird hauptsächlich verwendet, um Strukturen und Arrays zu initialisieren.
– Ich bin echt
10. November 2012 um 23:37 Uhr
es ist also wie Array zu sagen[value]? Warum nicht einfach so, was bringt es dann, Memset zu verwenden?
– Brandon Ling
10. November 2012 um 23:38 Uhr
Du kannst es gerne machen array[value] nur wenn Sie den Wert kennen value während der Kompilierzeit (das ist C/C++).
– unerschöpflich
10. November 2012 um 23:39 Uhr
Weil Sie alle Bytes auf der Struktur/dem Array gleichzeitig setzen können. Sie könnten dies mit einer for-Schleife tun, aber memset wird viel besser funktionieren.
– Ich bin echt
10. November 2012 um 23:40 Uhr
Dietmar Kühl
memset() ist eine sehr schnelle Version einer relativ einfachen Operation:
void* memset(void* b, int c, size_t len) {
char* p = (char*)b;
for (size_t i = 0; i != len; ++i) {
p[i] = c;
}
return b;
}
Das ist, memset(b, c, l) setze die l Bytes ab Adresse b zum Wert c. Es macht es nur viel schneller als in der obigen Implementierung.
@Neil: guter Punkt – ich bin eine C++ Person und mir wurde klar, dass ich mich auf die Konvertierung verlasse. Ich werde den Code so ändern, dass er sowohl C als auch C++ ist.
– Dietmar Kühl
10. November 2012 um 23:56 Uhr
Wie codiert hat Ihre Funktion ein implementierungsdefiniertes Verhalten, weil c möglicherweise außerhalb des Bereichs für die char Typ. Sie sollten stattdessen definieren p wie unsigned char *p = (unsigned char*)b; (Die Umwandlung wird nur in C++ benötigt).
– chqrlie
15. September 2017 um 15:58 Uhr
@DietmarKühl Wie kommt es, dass es viel schneller geht? Wie könnte es sonst möglich sein, auf eine Schleife zu verzichten? Wird dafür eine OS-API verwendet? Und selbst dann würde es immer noch eine Schleife erfordern.
– KeyC0de
29. Oktober 2018 um 9:01 Uhr
@Nik-Lz: Der Compiler weiß Bescheid memset() und muss keine Analyse der Argumente durchführen und kann problemlos Vektoroperationen generieren. Zugegeben, viele Compiler werden Schleifen im Optimierungsmodus vektorisieren.
– Dietmar Kühl
29. Oktober 2018 um 10:36 Uhr
memset() wird normalerweise verwendet, um Werte zu initialisieren. Betrachten Sie zum Beispiel die folgende Struktur:
struct Size {
int width;
int height;
}
Wenn Sie eine davon auf dem Stapel erstellen, gehen Sie folgendermaßen vor:
struct Size someSize;
Dann werden die Werte in dieser Struktur undefiniert sein. Sie könnten null sein, sie könnten beliebige Werte sein, die zufällig da waren, als dieser Teil des Stapels zuletzt verwendet wurde. Normalerweise würden Sie dieser Zeile folgen mit:
memset(&someSize, 0, sizeof(someSize));
Natürlich kann es für andere Szenarien verwendet werden, dies ist nur eines davon. Betrachten Sie es einfach als eine Möglichkeit, einen Teil des Speichers einfach auf einen bestimmten Wert zu setzen.
Angesichts der Frage, was der Sinn von Memset ist, ist diese Antwort imho besser als die akzeptierte.
– erol yeniaras
19. Januar 2016 um 17:49 Uhr
memset ist eine gängige Methode, um einen Speicherbereich unabhängig vom Datentyp auf 0 zu setzen. Das kann man sagen memset kümmert sich nicht um den Datentyp und setzt einfach alle Bytes auf Null.
IMHO in C++ sollte man das vermeiden memset Wenn möglich, da es die Typsicherheit umgeht, die C++ bietet, sollte man stattdessen Konstruktor oder Initialisierung als Mittel zur Initialisierung verwenden. Memset, das auf einer Klasseninstanz ausgeführt wird, kann auch unbeabsichtigt etwas zerstören:
z.B
class A
{
public:
shared_ptr<char*> _p;
};
a memset in einem Fall des Obigen würde ein Referenzzähler nicht richtig dekrementieren.
Diese Antwort sollte weiter oben auf der Liste stehen. Es ist nicht sicher, memset in C++ zu verwenden.
– Matt Messersmith
30. November 2017 um 14:50 Uhr
Ich vermute, dass serv_addr ist eine lokale oder globale Variable von einigen struct Typ -vielleicht struct sockaddr– (oder vielleicht ein class).
&serv_addr nimmt die Adresse dieser Variablen. Es ist eine gültige Adresse, die als erstes Argument an gegeben wird memset. Das zweite Argument zu memset ist das zum Auffüllen zu verwendende Byte (Nullbyte). Das letzte Argument zu memset ist die Größe dieser Speicherzone in Bytes, die gefüllt werden soll, was die Größe davon ist serv_addr Variable in deinem Beispiel.
Also dieser Aufruf an memset löscht eine globale oder lokale Variable serv_addr einige enthalten struct.
In der Praxis ist die GCC Der Compiler generiert bei der Optimierung cleveren Code dafür, indem er ihn normalerweise entrollt und einbettet (eigentlich ist es oft ein eingebautes, also GCC kann sehr cleveren Code dafür generieren).
Wein
Es ist nichts anderes, als den Speicher auf einen bestimmten Wert zu setzen.
Hier ist Beispielcode.
Memset(const *p,unit8_t V,unit8_t L) , Hier ist P der Zeiger auf den Zielspeicher, V ist der Wert zum Zielpuffer, der auf einen Wert V gesetzt wird, und l ist die Länge der Daten.
while(L --> 0)
{
*p++ = V;
}
Schönes Beispiel für den downto to-Operator -->aber ich bin sehr skeptisch, was die Art der L Streit: unit8_t sollte sein size_t.
– chqrlie
15. September 2017 um 16:05 Uhr
Scheiße
memset- setzt Bytes im Speicher
Zusammenfassung-
#include<string.h>
void *memset(void *s,int c,size_t n)
Beschreibung- Die Funktion memset() soll c (umgewandelt in ein Zeichen ohne Vorzeichen) in jedes der ersten n Bytes des Objekts kopieren, auf das s zeigt.
Hier für die obige Funktion soll memset() den Wert zurückgeben.
Schönes Beispiel für den downto to-Operator -->aber ich bin sehr skeptisch, was die Art der L Streit: unit8_t sollte sein size_t.
– chqrlie
15. September 2017 um 16:05 Uhr
14109800cookie-checkMemset-Definition und Verwendungyes
Es wird hauptsächlich verwendet, um Strukturen und Arrays zu initialisieren.
– Ich bin echt
10. November 2012 um 23:37 Uhr
es ist also wie Array zu sagen[value]? Warum nicht einfach so, was bringt es dann, Memset zu verwenden?
– Brandon Ling
10. November 2012 um 23:38 Uhr
Du kannst es gerne machen
array[value]
nur wenn Sie den Wert kennenvalue
während der Kompilierzeit (das ist C/C++).– unerschöpflich
10. November 2012 um 23:39 Uhr
Weil Sie alle Bytes auf der Struktur/dem Array gleichzeitig setzen können. Sie könnten dies mit einer for-Schleife tun, aber memset wird viel besser funktionieren.
– Ich bin echt
10. November 2012 um 23:40 Uhr