Programowanie C

Jak używana jest funkcja Memset

Jak używana jest funkcja Memset

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:

  1. 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.
  2. 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.
  3. 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.

Gry 5 najlepszych kart do przechwytywania gier
5 najlepszych kart do przechwytywania gier
Wszyscy widzieliśmy i uwielbialiśmy strumieniowe rozgrywki na YouTube on. PewDiePie, Jakesepticye i Markiplier to tylko niektórzy z najlepszych graczy...
Gry Jak stworzyć grę na Linuksie
Jak stworzyć grę na Linuksie
Dziesięć lat temu niewielu użytkowników Linuksa przewidywało, że ich ulubiony system operacyjny pewnego dnia stanie się popularną platformą do gier dl...
Gry Open Source Ports of Commercial Game Engines
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...