W języku C funkcja memset() służy do ustawienia jednobajtowej wartości bloku pamięci bajt po bajcie. Ta funkcja jest przydatna do inicjalizacji bloku pamięci bajt po bajcie przez określoną wartość. W tym artykule przyjrzymy się szczegółowo, jak można wykorzystać tę funkcję. Więc zacznijmy.
Plik nagłówka:
1 | strunowy.h |
Składnia:
1 | void *memset(void *str, int ch, size_t n) |
Ta funkcja ustawia pierwszą nie bajty bloku pamięci wskazywanego przez str przez ch.
Argumenty:
Funkcja przyjmuje 3 argumenty:
- str: To jest wskaźnik lokalizacji pamięci, w której zostanie ustawiona pamięć. To jest pusty wskaźnik, więc możemy ustawić dowolny typ bloku pamięci, ale pamięć zostanie ustawiona bajt po bajcie.
- ch: To jest wartość, która ma zostać skopiowana do bloku pamięci. Jest to wartość całkowita, ale przed skopiowaniem jest konwertowana na znak bez znaku.
- nie: Jest to liczba bajtów w bloku pamięci, który jest ustawiony.
Zwracane wartości:
memset() zwraca pierwszy adres bloku pamięci, od którego zaczyna ustawiać wartość.
Przykłady:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //Przykład 1.do #zawierać #zawierać int main() znak [30] = "ABCD EFGH"; printf("Przed memsetem => %s",str); memset(str,'x',3); printf("\nPo memset => %s\n",str); zwróć 0; |
W przykładzie 1.c, zadeklarowaliśmy jedną tablicę znaków o rozmiarze 30. Następnie zainicjalizowaliśmy go ciągiem „ABCD EFGH.” W funkcji memset przekazaliśmy 3 argumenty str, 'x' i 3. Tak więc blok pamięci wskazany przez str zostanie zresetowany przez pierwsze 3 znaki przez 'x.' Po memset, kiedy drukujemy pamięć, otrzymamy „xxxD EFGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //Przykład2.do #zawierać #zawierać int main() znak [30] = "ABCD EFGH"; printf("Przed memsetem => %s",str); memset(str+4,'x',3); printf("\nPo memset => %s\n",str); zwróć 0; |
W przykładzie 2.c, przekazaliśmy str+4 do funkcji memset. Tak więc resetuje pamięć po czwartej lokalizacji str. Po memset, gdy wydrukujemy pamięć, otrzymamy „ABCDxxxGH.”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Przykład3.do #zawierać #zawierać int main() int arr[5],i; memset(arr,10,5*rozmiar(arr[0])); printf("\narr Elementy => \n"); dla(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); zwróć 0; |
W przykładzie3.c, zadeklarowaliśmy tablicę liczb całkowitych o rozmiarze 5 i próbujemy ją zainicjować przez 10. Ale z danych wyjściowych widzieliśmy, że tablica nie jest inicjowana przez 10; zamiast tego mamy wartość „168430090”. Dzieje się tak dlatego, że wartość całkowita jest większa niż jeden bajt, a funkcja memset konwertuje wartość na znak bez znaku przed skopiowaniem . Teraz zobaczymy, jak otrzymamy wartość „168430090”.
Binarna reprezentacja 10 to 00000000 00000000 00000000 00001010.
Gdy liczba całkowita jest konwertowana na znak bez znaku, brany jest pod uwagę dolny 1 bajt. Tak więc, gdy 10 jest konwertowane na znak bez znaku, jest to reprezentacja binarna to 00001010.
funkcja memset() ustawia lokalizację pamięci bajt po bajcie. Czyli łącznie 4 bajty wyniosą: 00001010 00001010 00001010 00001010.
Wartość dziesiętna reprezentacji binarnej 4 bajtów to 168430090.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Przykład4.do #zawierać #zawierać int main() int arr[5],i; memset(arr,0,5*rozmiar(arr[0])); printf("\narr Elementy => \n"); dla(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); zwróć 0; |
W przykładzie 4.c, zainicjalizowaliśmy tablicę liczb całkowitych przez 0. Wszystkie bity binarnej reprezentacji 0 to 0. Tak więc tablica jest inicjowana przez 0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Przykład5.do #zawierać #zawierać int main() int arr[5],i; memset(arr,-1,5*rozmiar(arr[0])); printf("\narr Elementy => \n"); dla(i=0;i<5;i++) printf("%d\t",arr[i]); printf("\n"); zwróć 0; |
W przykładzie 5.c, zainicjalizowaliśmy tablicę liczb całkowitych przez 0. Wszystkie bity binarnej reprezentacji -1 to 1. Tak więc tablica jest inicjowana przez -1.
Wniosek:
W tym artykule zobaczyliśmy, jak za pomocą funkcji memset możemy efektywnie zainicjować lub ustawić wartość bloku pamięci. Możemy ustawić dowolny znak i 0 lub -1 jako wartość całkowitą dla bloku pamięci. Funkcja Memset jest szybsza do ustawienia dużej porcji pamięci ciągłej w porównaniu z prostym ustawieniem lokalizacji za pomocą pętli.