1. memset
tähendab? Ülevaade ja kasutus
memset
on üks C-keeles kasutatav mäluhaldusfunktsioon, mida kasutatakse mälupiirkonna initsialiseerimiseks kindla väärtusega. See funktsioon määrab määratud mälublokile kindla väärtuse baitide kaupa ning puhastab mälu tõhusalt. Peamiselt kasutatakse seda massiivide initsialiseerimiseks või turvalisuse suurendamiseks, kui on vaja mälu andmetest puhastada.
- Näide: massiivi initsialiseerimine, tundlike andmete kustutamine jms
Seda funktsiooni õigesti kasutades saab programmide mäluhaldust optimeerida ning parandada turvalisust.
2. memset
funktsiooni põhiline kasutusviis
2.1 memset
funktsiooni süntaks
memset
-i põhistruktuur on järgmine:
#include <string.h>
void *memset(void *buf, int ch, size_t n);
- Esimene argument (
buf
): määrab mälubloki algusaadressi, mida initsialiseeritakse. - Teine argument (
ch
): väärtus, mis salvestatakse mällu. Salvestatakse baitidena. - Kolmas argument (
n
): määrab baitide arvu, mida mällu kirjutatakse.
2.2 memset
kasutusnäide
Järgnevalt on näide, kus massiivi osa initsialiseeritakse kindla väärtusega.
#include <stdio.h>
#include <string.h>
int main() {
char buf[10] = "ABCDEFGHIJ";
// Kirjutame väärtuse '1' kolmel baitil alates kolmandast positsioonist
memset(buf + 2, '1', 3);
printf("buf string → %s
", buf); // Väljund: "AB111FGHIJ"
return 0;
}
Selles näites kasutatakse memset
-i, et kirjutada buf
puhvri kolmandast baitist alates kolm baiti väärtusega '1'
. Väljund on "AB111FGHIJ"
, kus määratud osa on asendatud antud väärtusega.

3. memset
praktilised kasutusnäited
3.1 Massiivi initsialiseerimine
memset
on väga kasulik massiivide initsialiseerimiseks. Täites kogu massiivi kindla väärtusega, saab initsialiseerimise lihtsustada. Allpool on näide, kuidas massiiv nullidega täita.
#include <stdio.h>
#include <string.h>
int main() {
int arr[10];
memset(arr, 0, sizeof(arr));
return 0;
}
Selles näites initsialiseeritakse kogu arr
massiiv nullidega.
3.2 Mälupuhastus ja turvalisuse suurendamine
memset
kasutatakse ka tundlike andmete (nt paroolid, krüpteerimisvõtmed) kustutamiseks mälust. Järgmises näites kustutatakse parool memset
abil.
#include <string.h>
void clearPassword(char *password) {
// Parooli kasutamine
memset(password, 0, strlen(password)); // Nullib parooli mälust
}
Kustutades parooli mälust, saab vältida selle lekkimist ja tõsta süsteemi turvalisust.
3.3 Koos kasutamine dünaamilise mälu eraldamisega
memset
-i saab kasutada ka koos malloc
-iga eraldatud dünaamilise mäluga, et see algväärtustada. Allpool on vastav näide.
#include <stdlib.h>
#include <string.h>
int main() {
char *buffer = (char *)malloc(50);
if (buffer == NULL) {
return 1; // Mälueraldus ebaõnnestus
}
// Initsialiseerib mälu nullidega
memset(buffer, 0, 50);
free(buffer); // Vabastab mälu
return 0;
}

4. memset
kasutamisel tähelepanu vajavad punktid
4.1 Puhvri ületäitumise vältimine
memset
kasutamisel tuleb olla ettevaatlik, et vältida puhvri ületäitumist. Kui määratud suurus ületab tegeliku mälubloki suuruse, võib see mõjutada teisi mälupiirkondi. Kasuta sizeof
operaatorit, et tagada õige suurus.
char buffer[10];
memset(buffer, 0, sizeof(buffer)); // Õige suuruse määramine
4.2 Mõju andmetüüpidele
Kuna memset
initsialiseerib mälu baitide kaupa, võib see tekitada ootamatuid tulemusi, kui kasutatakse mitte-null väärtusi täisarvude või ujukomaarvude massiivide korral. Eriti kui struktuurid sisaldavad erinevat tüüpi liikmeid, tuleb seda kasutada ettevaatlikult.
4.3 Kompilaatori optimeerimise mõju
Tundlike andmete (nt paroolide) puhastamisel memset
abil võib tekkida oht, et kompilaatori optimeerimine eemaldab selle käsu. Sellisel juhul on soovitatav kasutada volatile
võtmesõna või turvalisemat versiooni nagu memset_s
.
volatile char *secure_clear = memset(password, 0, strlen(password));
5. memset
ja teiste mälufunktsioonide võrdlus
5.1 Erinevus memcpy
funktsioonist
memset
ja memcpy
on mõlemad mäluhaldusfunktsioonid, kuid nende otstarve on erinev.
memset
: initsialiseerib mälubloki kindla väärtusega. Seab kõik baidid ühe ja sama väärtusega.memcpy
: kopeerib andmed ühest mälublokist teise. Kasutatakse andmete kopeerimiseks, mitte initsialiseerimiseks.
5.2 Võrdlus for
-tsükliga
Nii memset
kui ka for
-tsükkel võivad massiive initsialiseerida, kuid neil on erinevad eelised ja puudused.
memset
eelised: kood on lühem ja loetavam ning kompilaator saab seda sageli optimeerida, mistõttu on see tavaliselt kiirem kuifor
-tsükkel.for
-tsükli eelised: võimaldab igale elemendile määrata erineva väärtuse – suurem paindlikkus initsialiseerimisel.
int array[5];
for (int i = 0; i < 5; i++) {
array[i] = i; // Määrab igale elemendile erineva väärtuse
}

6. Kokkuvõte
memset
on võimas tööriist, mis võimaldab tõhusalt initsialiseerida või puhastada mälu. Siiski on oluline mõista, kuidas õigesti määrata suurust ja milline mõju võib tekkida erinevate andmetüüpide korral. Kui memset
-i kasutatakse õigesti, aitab see parandada programmi tõhusust ja turvalisust.