C-ben a memset () függvény segítségével egy bájtos értéket állíthatunk be egy memória blokk bájtra byte-onként. Ez a funkció hasznos a memória blokk bájt byte általi inicializálásához egy adott érték által. Ebben a cikkben részletesen megnézzük, hogyan használható ez a függvény. Tehát kezdjük.
Fejlécfájl:
1 | húr.h |
Szintaxis:
1 | void * memset (void * str, int ch, size_t n) |
Ez a függvény állítja be az elsőt n byte a memóriablokk által mutatott str által ch.
Érvek:
A függvény 3 argumentumot tartalmaz:
- str: Ez a memória helyének mutatója, ahol a memória be lesz állítva. Ez egy érvénytelen mutató, így bármilyen típusú memóriablokkot beállíthatunk, de a memóriát bájtonként bájt állítja be.
- ch: Ezt az értéket kell átmásolni a memória blokkba. Ez egy egész érték, de a másolás előtt előjel nélküli karakterré konvertálódik.
- n: Ez a bájtok száma a beállított memória blokkban.
Visszatérési értékek:
memset () a memóriablokk első címét adja vissza, ahonnan az értéket kezdi beállítani.
Példák:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Példa1.c #include #include int main () char str [30] = "ABCD EFGH"; printf ("Memset előtt =>% s", str); memset (str, 'x', 3); printf ("\ nA memória után =>% s \ n", str); visszatér 0; |
Az 1. példában.c, egy 30 méretű karaktertömböt deklaráltunk. Ezután inicializáltuk az „ABCD EFGH.”A memset függvényben 3 str,„ x ”és 3 argumentumot adtunk át. Tehát, az str által jelölt memóriablokk az első 3 karaktert 'x-gyel alaphelyzetbe állítja.'A memória után, amikor kinyomtatjuk a memóriát, megkapjuk az „xxxD EFGH-t.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 2. példa.c #include #include int main () char str [30] = "ABCD EFGH"; printf ("Memset előtt =>% s", str); memset (str + 4, 'x', 3); printf ("\ nA memória után =>% s \ n", str); visszatér 0; |
A 2. példában.c, az str + 4-et átadtuk a memset függvénynek. Tehát, visszaállította a memóriát a str 4. helye után. A memória után, amikor kinyomtatjuk a memóriát, megkapjuk az „ABCDxxxGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 3. példa.c #include #include int main () int arr [5], i; memset (arr, 10,5 * sizeof (arr [0])); printf ("\ narr Elements => \ n"); mert (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); visszatér 0; |
A 3. példában.c, deklaráltunk egy 5-ös egész tömböt, és megpróbáltuk inicializálni 10-vel. De a kimenetből azt láttuk, hogy a tömböt nem inicializálja 10; ehelyett a „168430090” értéket kaptuk. Ez azért van, mert az egész érték nagyobb, mint egy bájt, és a memset függvény átalakítja az értéket aláíratlan karakterré másolás előtt. Most meglátjuk, hogyan fogjuk megkapni az „168430090” értéket.
A 10 bináris ábrázolása 00000000 00000000 00000000 00001010.
Ha az egész számot előjel nélküli karakterré konvertáljuk, az alsó 1 bájtot vesszük figyelembe. Tehát, ha a 10-et átalakítjuk előjel nélküli karakterré, akkor a bináris reprezentáció 00001010.
A memset () függvény bájtonként állítja be a memória helyét. Tehát összesen 4 bájt lesz: 00001010 00001010 00001010 00001010.
A 4 bájt bináris ábrázolásának tizedesértéke 168430090.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Példa4.c #include #include int main () int arr [5], i; memset (arr, 0,5 * sizeof (arr [0])); printf ("\ narr Elements => \ n"); mert (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); visszatér 0; |
A 4. példában.c, az egész tömböt 0-val inicializáltuk. A 0 bináris ábrázolásának minden bitje 0. Tehát a tömböt 0-val inicializáljuk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Példa5.c #include #include int main () int arr [5], i; memset (arr, -1,5 * sizeof (arr [0])); printf ("\ narr Elements => \ n"); mert (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); visszatér 0; |
Az 5. példában.c, az egész tömböt 0-val inicializáltuk. A -1 bináris ábrázolásának minden bitje 1. Tehát a tömböt inicializálja -1.
Következtetés:
Ebben a cikkben a memset függvény segítségével láthattuk, hogyan lehet inicializálni vagy hatékonyan beállítani a memória blokk értékét. Bármelyik karaktert és 0 vagy -1 egész értékként beállíthatunk egy memória blokkra. A Memset funkció gyorsabb, ha nagy darab összefüggő memóriát állít be, összehasonlítva azzal, hogy egyszerűen megadja a helyet egy hurok segítségével.