U C, funkcija memset () koristi se za postavljanje jednobajtne vrijednosti na bajt po bajt memorijskog bloka. Ova je funkcija korisna za inicijalizaciju bajta po bajt memorije određenom vrijednošću. U ovom ćemo članku detaljno vidjeti kako se ova funkcija može koristiti. Pa, krenimo.
Datoteka zaglavlja:
1 | niz.h |
Sintaksa:
1 | void * memset (void * str, int ch, size_t n) |
Ova funkcija postavlja prvo n bajtova memorijskog bloka na koji ukazuje str po CH.
Argumenti:
Funkcija uzima 3 argumenta:
- str: Ovo je pokazivač mjesta memorije na kojem će se memorija postaviti. Ovo je void pokazivač, tako da možemo postaviti bilo koji tip memorijskog bloka, ali memorija će se postavljati bajt po bajt.
- CH: Ovo je vrijednost koju treba kopirati u memorijski blok. Ovo je cjelobrojna vrijednost, ali se prije kopiranja pretvara u nepotpisani znak.
- n: Ovo je broj bajtova u memorijskom bloku koji je postavljen.
Povratne vrijednosti:
memset () vraća prvu adresu memorijskog bloka odakle počinje postavljati vrijednost.
Primjeri:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Primjer1.c #include #include int main () char str [30] = "ABCD EFGH"; printf ("Prije memseta =>% s", str); memset (str, 'x', 3); printf ("\ nNakon memset =>% s \ n", str); return 0; |
U Primjeru1.c, proglasili smo jedan niz znakova veličine 30. Tada smo ga inicijalizirali nizom „ABCD EFGH.”U memset funkciji proslijedili smo 3 argumenta str, 'x' i 3. Dakle, memorijski blok na koji pokazuje str resetirat će prva 3 znaka za 'x.'Nakon memseta, kada ispisujemo memoriju, dobit ćemo "xxxD EFGH."
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Primjer2.c #include #include int main () char str [30] = "ABCD EFGH"; printf ("Prije memseta =>% s", str); memset (str + 4, 'x', 3); printf ("\ nNakon memset =>% s \ n", str); return 0; |
U Primjeru2.c, proslijedili smo str + 4 funkciji memset. Dakle, resetirao je memoriju nakon 4. mjesta str. Nakon memseta, kada ispisujemo memoriju, dobit ćemo “ABCDxxxGH."
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Primjer3.c #include #include int main () int arr [5], i; memset (arr, 10,5 * veličina (arr [0])); printf ("\ narr Elementi => \ n"); za (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); return 0; |
U Primjeru3.c, proglasili smo cjelobrojni niz veličine 5 i pokušali ga inicijalizirati za 10. Ali iz izlaza smo vidjeli da niz nije inicijaliziran s 10; umjesto toga, dobili smo vrijednost "168430090". To je zato što je cijela vrijednost veća od jednog bajta i funkcija memset pretvara vrijednost u nepotpisani znak prije kopiranja. Sad ćemo vidjeti kako ćemo dobiti vrijednost “168430090”.
Binarni prikaz 10 je 00000000 00000000 00000000 00001010.
Kada se cijeli broj pretvori u nepotpisani char, uzima se u obzir donji 1 bajt. Dakle, kada se 10 pretvori u nepotpisani char, to je binarni prikaz 00001010.
funkcija memset () postavlja bajt po bajt memorijskog mjesta. Dakle, ukupno 4 bajta bit će: 00001010 00001010 00001010 00001010.
Decimalna vrijednost binarnog prikaza od 4 bajta je 168430090.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Primjer4.c #include #include int main () int arr [5], i; memset (arr, 0,5 * sizeof (arr [0])); printf ("\ narr Elementi => \ n"); za (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); return 0; |
U primjeru4.c, inicijalizirali smo čitav niz s 0. Svi bitovi binarnog prikaza 0 su 0. Dakle, niz je inicijaliziran s 0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Primjer5.c #include #include int main () int arr [5], i; memset (arr, -1,5 * sizeof (arr [0])); printf ("\ narr Elementi => \ n"); za (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); return 0; |
U primjeru5.c, inicijalizirali smo čitav niz s 0. Svi bitovi binarnog prikaza -1 su 1. Dakle, niz je inicijaliziran sa -1.
Zaključak:
U ovom smo članku vidjeli pomoću funkcije memset kako možemo učinkovito inicijalizirati ili postaviti vrijednost memorijskog bloka. U memorijski blok možemo postaviti bilo koji znak i 0 ili -1 kao cjelobrojnu vrijednost. Memset funkcija je brža za postavljanje velikog dijela neprekidne memorije u usporedbi s jednostavnim postavljanjem lokacije pomoću petlje.