• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyzerowanie tablicy - szybki sposób

Object Storage Arubacloud
0 głosów
18,314 wizyt
pytanie zadane 5 sierpnia 2015 w C i C++ przez Dragonet.17 Pasjonat (19,630 p.)
edycja 5 sierpnia 2015 przez Dragonet.17
Witam serdecznie, czy jest jakiś sposób aby szybko i bezboleśnie wyzerować zawartość dowolnej tablicy ?
Najlepiej jedna linia kodu.
Tablica alokowana dynamicznie [n]

Można to zrobić z użyciem np memset ?

memset(tablica, 0, n);
Czy jest to poprawna forma?

5 odpowiedzi

+2 głosów
odpowiedź 5 sierpnia 2015 przez Bartek85 Mądrala (7,440 p.)
wybrane 5 sierpnia 2015 przez Dragonet.17
 
Najlepsza

Tak, jest. właśnie memset.

Prototyp:

memset(Void *ptr, int value, size_t size);

Uzycie:

	int tab[100];
	memset(tab, 0, 100 * sizeof(int));

Należy pamiętać, że:

  • memset operuje na bajtach, a nie na typach. Dla wyzerowania sie sprawdzi świetnie, do uzupełnienia tablic jakąś wartościa, nie koniecznie ;)
  • rozmiar do wyzerowania podejemy w bajtach, wiec musimy podać liczbę elementów i rozmiar w bajtach jednego elementu.(Tak jak w przykładzie).
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Używając wskaźników formuła memset jest taka sama ?
komentarz 5 sierpnia 2015 przez Bartek85 Mądrala (7,440 p.)
Co masz na myśli używając wskaźników? Przecież jako argument podajesz właśnie wskaźnik?

memset działa tak: Od adresu który podałeś, ustawia wartość val na "odległości" ilości bajtów podanej jako size. Nie ważne na co jest ten wskaźnik, czy na tablicę, czy na jakiś obiekt.
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Wyskoczył błąd i stąd było to pytanie,sytuacja wyglądała w ten sposób.

int *tablica;
cin >> n;
tablica = new int[n];

memset(tablica, 0, n*sizeof(int));
komentarz 5 sierpnia 2015 przez Bartek85 Mądrala (7,440 p.)
Hm... Jaki błąd? składnia wygląda dobrze.
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Ok, o to mi chodziło, dziękuje za pomoc
+1 głos
odpowiedź 5 sierpnia 2015 przez Boshi VIP (100,240 p.)
W pętli przypisujesz 0? albo ja nie rozumiem o co pytasz...
komentarz 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
zerowanie tablicy forem ma w wiekszosci przypadkow taka sama wydajnosc jak memset.
komentarz 5 sierpnia 2015 przez Bartek85 Mądrala (7,440 p.)
Chyba sobie żartujesz...
komentarz 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
wiekszosc kompilatorow zastapi zerowanie forem i zerowanie z uzyciem memset dokladnie tym samym kodem;
komentarz 5 sierpnia 2015 przez Bartek85 Mądrala (7,440 p.)
To już zależy czy kompilator jest uruchomiony z opcja optymalizacji(i jaką). Poza tym, nie każdy kod kompilator umie zoptymalizować.
komentarz 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
stąd slowo kluczowe wiekszość na początku komentarza :)
+1 głos
odpowiedź 5 sierpnia 2015 przez hit02 Nałogowiec (33,970 p.)

memset() jest ok. Pamiętaj tylko, że ostatni argument, to ilość bajtów w tablicy, więc dla tablicy intów będzie to tak:

int * tab = malloc(0x100);
memset(tab, 0, 0x100 * sizeof(int));

a także, że drugi argument jest potem konwertowany na unsigned char (czyli bajt) więc nie wpiszesz tam wartości większej od 255, jeśli byś kiedyś chciał.

Możesz również wykorzystać fakt, że pamięć otrzyana od systemu jest wyzerowana. Możesz zadeklarować tablicę statyczną lub globalną. Będzie ona zainicjowana zerami. Możesz też poprosić system o nową pamięć. Niestety nie wiem, jak w tym przypadku zachowuje się malloc(). Możliwe, że pamięć otrzymana tą funkcją nie będzie zawsze wyzerowana, bo z tego, co kojażę ona nie zawsze prosi system o pamięć - zazwyczaj system może przydzielić jedynie 4096 bajtów i ich wielokrotność.

komentarz 5 sierpnia 2015 przez sZRAMEK Nowicjusz (200 p.)
rozwiewam watpliwosc malloc nie zeruje pamieci.
komentarz 5 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Rozumiem, jednak ta tablica jest w pętli, więc musiałbym ją z każdym krokiem deklarować na nowo, tym bardziej że była ona zadeklarowana dynamicznie, przed pętlą
+1 głos
odpowiedź 22 listopada 2015 przez Int_main Bywalec (2,850 p.)
Funkcja calloc służy do wypełniania tablicy zerami.
+1 głos
odpowiedź 22 listopada 2015 przez adrian17 Ekspert (346,020 p.)

Jeśli mowa o inicjalizacji (a nie ustawianiu) tablicy to memset jest niepotrzebny:

// domyslna (zerowa) inicjalizacja tablicy statycznej
int tab[100] = {}; 
// domyslna (zerowa) inicjalizacja tablicy dynamicznej
int *p = new int[100]();
// wektor z 100 elementami zainicjowanymi domyslnie (zerami)
vector<int> vec(100);

 

Podobne pytania

+1 głos
1 odpowiedź 254 wizyt
pytanie zadane 31 stycznia 2021 w JavaScript przez Author[] Gaduła (3,130 p.)
0 głosów
2 odpowiedzi 6,332 wizyt
0 głosów
1 odpowiedź 161 wizyt

92,666 zapytań

141,564 odpowiedzi

320,019 komentarzy

62,031 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...