Namensräume
Varianten
Aktionen

memset, memset_explicit, memset_s

Von cppreference.com
< c‎ | string‎ | byte
Definiert in Header <string.h>
void *memset( void *dest, int ch, size_t count );
(1)
void *memset_explicit( void *dest, int ch, size_t count );
(2) (seit C23)
errno_t memset_s( void *dest, rsize_t destsz, int ch, rsize_t count );
(3) (seit C11)
1) Kopiert den Wert (unsigned char)ch in jedes der ersten count Zeichen des durch dest zeigenden Objekts.
Der Zugriff über das Ende des dest-Arrays hinaus ist undefiniertes Verhalten. Ein Nullzeiger für dest führt zu undefiniertem Verhalten.
2) Identisch mit (1), jedoch sicher für sensible Informationen.
3) Identisch mit (1), mit der Ausnahme, dass die folgenden Fehler zur Laufzeit erkannt werden und nach dem Speichern von ch an jeder Position des Zielbereichs [dest, dest+destsz) die aktuell installierte Constraint-Handler-Funktion aufrufen, falls dest und destsz selbst gültig sind
  • dest ist ein Nullzeiger
  • destsz oder count ist größer als RSIZE_MAX
  • count ist größer als destsz (Pufferüberlauf würde auftreten)
Das Verhalten ist undefiniert, wenn die Größe des durch dest zeigenden Zeichen-Arrays < count <= destsz ist; anders ausgedrückt, ein fehlerhafter Wert von destsz deckt den bevorstehenden Pufferüberlauf nicht auf.
Wie bei allen grenzgeprüften Funktionen ist memset_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <string.h> auf die ganzzahlige Konstante 1 setzt.

Inhalt

[edit] Parameter

dest - Zeiger auf das zu füllende Objekt
ch - Füllbyte
zählt - Anzahl der zu füllenden Bytes
destsz - Größe des Ziel-Arrays

[edit] Rückgabewert

1,2) Eine Kopie von dest
3) Null bei Erfolg, ungleich Null bei einem Fehler. Bei einem Fehler, wenn dest kein Nullzeiger ist und destsz gültig ist, werden destsz Füllbytes ch in das Ziel-Array geschrieben.

[edit] Hinweise

memset kann (gemäß den as-if-Regeln) wegoptimiert werden, wenn das von dieser Funktion modifizierte Objekt für den Rest seiner Lebensdauer nicht mehr zugegriffen wird (z.B. gcc bug 8537). Aus diesem Grund kann diese Funktion nicht zum Scrubben von Speicher (z.B. zum Auffüllen eines Arrays, das ein Passwort enthielt, mit Nullen) verwendet werden.

Diese Optimierung ist für memset_explicit und memset_s untersagt: sie garantieren die Durchführung der Speicherbeschreibungen.

Drittanbieterlösungen dafür umfassen FreeBSD explicit_bzero oder Microsoft SecureZeroMemory.

[edit] Beispiel

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main(void)
{
    char str[] = "ghghghghghghghghghghgh";
    puts(str);
    memset(str,'a',5);
    puts(str);
 
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = memset_s(str, sizeof str, 'b', 5);
    printf("str = \"%s\", r = %d\n", str, r);
    r = memset_s(str, 5, 'c', 10);   // count is greater than destsz  
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

Mögliche Ausgabe

ghghghghghghghghghghgh
aaaaahghghghghghghghgh
str = "bbbbbhghghghghghghghgh", r = 0
str = "ccccchghghghghghghghgh", r = 22

[edit] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.24.6.1 The memset function (S. 270)
  • K.3.7.4.1 The memset_s function (S. 451)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.24.6.1 The memset function (S. 371)
  • K.3.7.4.1 The memset_s function (S. 621-622)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.21.6.1 The memset function (S. 333)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.11.6.1 The memset function

[edit] Siehe auch

kopiert einen Puffer in einen anderen
(Funktion) [bearbeiten]
kopiert das gegebene breite Zeichen in jede Position eines breiten Zeichen-Arrays
(Funktion) [bearbeiten]
C++ Dokumentation für memset