Memset-Definition und Verwendung

Lesezeit: 5 Minuten

Benutzeravatar von Brandon Ling
Brandon Ling

Was ist der Nutzen der Funktion memset()?.

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

Benutzeravatar von Dietmar Kühl
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).

Vinos Benutzer-Avatar
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

Benutzeravatar von Ashit
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

1410980cookie-checkMemset-Definition und Verwendung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy