В C функцията memset () се използва за задаване на еднобайтова стойност на блок от памет на байт по байт. Тази функция е полезна за инициализиране на байт по памет на байт от определена стойност. В тази статия ще видим подробно как може да се използва тази функция. И така, нека започнем.
Заглавен файл:
1 | низ.з |
Синтаксис:
1 | void * memset (void * str, int ch, size_t n) |
Тази функция задава първата н байта на блока памет, посочен от ул от гл.
Аргументи:
Функцията отнема 3 аргумента:
- ул: Това е указателят на мястото на паметта, където ще бъде зададена паметта. Това е празен указател, така че можем да зададем всякакъв тип блок памет, но паметта ще се задава байт по байт.
- гл: Това е стойността, която трябва да се копира в блока памет. Това е целочислена стойност, но тя се преобразува в неподписан знак преди копиране.
- н: Това е броят на байтовете в блока памет, който е зададен.
Върнати стойности:
memset () връща първия адрес на блока памет, откъдето започва да задава стойността.
Примери:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Пример1.° С #include #include int main () char str [30] = "ABCD EFGH"; printf ("Преди memset =>% s", str); memset (str, 'x', 3); printf ("\ nСлед memset =>% s \ n", str); връщане 0; |
В Пример1.c, декларирахме един символен масив с размер 30. След това сме го инициализирали с низа „ABCD EFGH.”Във функцията memset сме предали 3 аргумента str, 'x' и 3. Така че блокът памет, посочен от str, ще нулира първите 3 знака с 'x.'След memset, когато отпечатаме паметта, ще получим „xxxD EFGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Пример2.° С #include #include int main () char str [30] = "ABCD EFGH"; printf ("Преди memset =>% s", str); memset (str + 4, 'x', 3); printf ("\ nСлед memset =>% s \ n", str); връщане 0; |
В Пример2.c, предадохме str + 4 на функцията memset. И така, той нулира паметта след 4-то местоположение на str. След memset, когато отпечатаме паметта, ще получим “ABCDxxxGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Пример3.° С #include #include int main () int arr [5], i; memset (arr, 10,5 * sizeof (arr [0])); printf ("\ narr Елементи => \ n"); за (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); връщане 0; |
В Пример3.c, декларирахме целочислен масив с размер 5 и се опитваме да го инициализираме с 10. Но от изхода видяхме, че масивът не се инициализира с 10; вместо това имаме стойността “168430090”. Това е така, защото целочислената стойност е по-голяма от един байт и функцията memset преобразува стойността в неподписан знак преди да бъде копирана. Сега ще видим как ще получим стойността “168430090”.
Двоичното представяне на 10 е 00000000 00000000 00000000 00001010.
Когато цяло число се преобразува в неподписан char, се взема предвид по-ниският 1 байт. Така че, когато 10 се преобразува в неподписан char, това е двоично представяне е 00001010.
Функцията memset () задава байт по местоположение на паметта. И така, общо 4 байта ще бъдат: 00001010 00001010 00001010 00001010.
Десетичната стойност на двоичното представяне на 4 байта е 168430090.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Пример4.° С #include #include int main () int arr [5], i; memset (arr, 0,5 * sizeof (arr [0])); printf ("\ narr Елементи => \ n"); за (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); връщане 0; |
В Пример4.c, инициализирахме целочисления масив с 0. Всички битове от двоичното представяне на 0 е 0. Така че масивът се инициализира с 0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Пример5.° С #include #include int main () int arr [5], i; memset (arr, -1,5 * sizeof (arr [0])); printf ("\ narr Елементи => \ n"); за (i = 0; i<5;i++) printf ("% d \ t", arr [i]); printf ("\ n"); връщане 0; |
В Пример5.c, инициализирахме целочисления масив с 0. Всички битове от двоичното представяне на -1 е 1. Така че масивът се инициализира от -1.
Заключение:
В тази статия видяхме с помощта на функцията memset как можем ефективно да инициализираме или зададем стойността на блок памет. Можем да зададем всеки знак и 0 или -1 като целочислена стойност на блок памет. Функцията Memset е по-бърза за задаване на голяма част от непрекъсната памет в сравнение с простото задаване на местоположението с помощта на цикъл.