In C wird die Funktion memset() verwendet, um einen Ein-Byte-Wert byteweise auf einen Speicherblock zu setzen. Diese Funktion ist nützlich, um einen Speicherblock byteweise mit einem bestimmten Wert zu initialisieren. In diesem Artikel werden wir im Detail sehen, wie diese Funktion verwendet werden kann. Also lasst uns anfangen.
Header-Datei:
1 | Schnur.ha |
Syntax:
1 | void *memset(void *str, int ch, size_t n) |
Diese Funktion setzt den ersten nein Bytes des Speicherblocks, auf den zeigt str durch CH.
Argumente:
Die Funktion benötigt 3 Argumente:
- str: Dies ist der Zeiger des Speicherplatzes, an dem der Speicher eingestellt wird. Dies ist ein void-Zeiger, also können wir jede Art von Speicherblock setzen, aber der Speicher wird Byte für Byte gesetzt.
- CH: Dies ist der Wert, der in den Speicherblock kopiert werden soll. Dies ist ein ganzzahliger Wert, der jedoch vor dem Kopieren in ein Zeichen ohne Vorzeichen umgewandelt wird.
- nein: Dies ist die Anzahl der Bytes im Speicherblock, die gesetzt wird.
Rückgabewerte:
memset() gibt die erste Adresse des Speicherblocks zurück, von der aus der Wert gesetzt wird.
Beispiele:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 | //Beispiel 1.c #einschließen #einschließen int main() char str[30] = "ABCD EFGH"; printf("Vor memset => %s",str); memset(str,'x',3); printf("\nNach memset => %s\n",str); 0 zurückgeben; |
In Beispiel1.c, wir haben ein Zeichenarray der Größe 30 . deklariert. Dann haben wir es mit dem String „ABCD EFGH . initialisiert.” In der Memset-Funktion haben wir 3 Argumente str, 'x' und 3 . übergeben. Der Speicherblock, auf den str zeigt, wird also die ersten 3 Zeichen um 'x . zurückgesetzt.' Nach memset, wenn wir den Speicher drucken, erhalten wir "xxxD EFGH".”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 | //Beispiel2.c #einschließen #einschließen int main() char str[30] = "ABCD EFGH"; printf("Vor memset => %s",str); memset(str+4,'x',3); printf("\nNach memset => %s\n",str); 0 zurückgeben; |
In Beispiel2.c, wir haben str+4 an die Memset-Funktion übergeben. Also setzt es den Speicher nach der 4. Stelle von str . zurück. Nach memset, wenn wir den Speicher drucken, erhalten wir "ABCDxxxGH".”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 17 18 | // Beispiel3.c #einschließen #einschließen int main() int arr[5],i; memset(arr,10,5*sizeof(arr[0])); printf("\narr Elemente => \n"); für(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); 0 zurückgeben; |
In Beispiel3.c haben wir ein Integer-Array der Größe 5 deklariert und versuchen, es mit 10 . zu initialisieren. Aber aus der Ausgabe haben wir gesehen, dass das Array nicht mit 10 initialisiert ist; stattdessen haben wir den Wert „168430090“. Dies liegt daran, dass der ganzzahlige Wert größer als ein Byte ist und die Memset-Funktion den Wert vor dem Kopieren in ein vorzeichenloses Zeichen umwandelt. Jetzt werden wir sehen, wie wir den Wert "168430090" erhalten.
Die binäre Darstellung von 10 ist 00000000 00000000 00000000 0000010.
Wenn Integer in unsigned char umgewandelt werden, wird das untere 1 Byte berücksichtigt. Wenn also 10 in unsigned char umgewandelt wird, ist es eine binäre Darstellung 000001010.
Die Funktion memset() setzt den Speicherplatz byteweise by. Insgesamt 4 Byte sind also: 00001010 00001010 00001010 00001010.
Der Dezimalwert der binären Darstellung von 4 Byte ist 168430090.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 17 18 | // Beispiel4.c #einschließen #einschließen int main() int arr[5],i; memset(arr,0,5*sizeof(arr[0])); printf("\narr Elemente => \n"); für(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); 0 zurückgeben; |
In Beispiel4.c, wir haben das Integer-Array mit 0 initial initialisiert. Alle Bits der binären Darstellung von 0 sind 0. Das Array wird also mit 0 . initialisiert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 fünfzehn 16 17 18 19 | // Beispiel5.c #einschließen #einschließen int main() int arr[5],i; memset(arr,-1,5*sizeof(arr[0])); printf("\narr Elemente => \n"); für(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); 0 zurückgeben; |
In Beispiel5.c, wir haben das Integer-Array mit 0 initial initialisiert. Alle Bits der binären Darstellung von -1 sind 1. Das Array wird also mit -1 . initialisiert.
Fazit:
In diesem Artikel haben wir mit der Memset-Funktion gesehen, wie wir den Wert eines Speicherblocks effizient initialisieren oder setzen können. Wir können ein beliebiges Zeichen und 0 oder -1 als ganzzahligen Wert für einen Speicherblock festlegen set. Die Memset-Funktion ist schneller, um einen großen Teil zusammenhängenden Speichers festzulegen, als wenn Sie den Speicherort einfach mit einer Schleife festlegen setting.