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

Deklaracja dynamicznej zmiennej

Object Storage Arubacloud
0 głosów
485 wizyt
pytanie zadane 21 listopada 2015 w C i C++ przez Zomfire Użytkownik (600 p.)
Czy da się utworzyć zmienną, która w funkcji będzie wykorzystywana jako zmienna iteracyjna, a potem po wykonaniu swojego zadania zostanie usunięta z pamięci? Wiem, że w C++ są do tego operatory new i delete. Jak się ma sprawa w C?

2 odpowiedzi

+2 głosów
odpowiedź 21 listopada 2015 przez Radfler VIP (101,030 p.)
Tak da się, wykorzystaj funkcje free i malloc z cstdlib: int* bar = malloc(sizeof(int)/* Alokowana pamięć w bajtach */); /* Praca... */ free(bar);
–1 głos
odpowiedź 21 listopada 2015 przez notabigthreat Mądrala (7,060 p.)
Przed definicją wstaw lewą klamrę ( '{' ), a po ostatnim użyciu - prawą ( '}' ).
komentarz 21 listopada 2015 przez hit02 Nałogowiec (33,970 p.)

To nie ma żadnego związku z dynamiczną alokacją pamięci. Zmienna zostanie zadeklarowana na stosie (stack), a nie na stercie (heap).

Dodatkowo kompilator najpewniej potraktuje tą zmienną tak samo, jak inne zmienne lokalne tj. zaalokuje dla niej pamięć na początku działania funkcji.

Jak to już napisał Radfler, w C używa się funkcji malloc() i free(). smiley

 

komentarz 21 listopada 2015 przez notabigthreat Mądrala (7,060 p.)

1) Tak, ale rozwiązuje to problem przedstawiony w pytaniu w prostszy sposób.
Parę różnic (na korzyść mojej propozycji ofc):

Z użyciem free+malloc:

int* wsk = malloc(sizeof(int));
//praca na "*wsk" ...
free(wsk);
wsk = NULL;
//"wsk" pozostaje w zasięgu, kod używający teraz *wsk się kompiluje, choć jest niepoprawny

Z użyciem klamer:

{
  int zmienna;
  //praca na "zmienna" ...
}
//ani śladu po "zmienna", kod dalej jej używający jest niepoprawny i się nie kompiluje

Z tego, że zmienna ma być "iteracyjna", wnioskuję, że jest to jakiś licznik.
Czy liczniki tworzysz na stercie?

komentarz 22 listopada 2015 przez hit02 Nałogowiec (33,970 p.)

Czasami i to się zdarza, ale raczej nie są to proste pętle. wink

Jednak autor pytania wyraźnie zaznaczył w tagach, że chodzi mu o alokowanie pamięci. Co do programowania dynamicznego, to mam pewne wątpliwości, że o to mu chodziło, ale nie ważne...

Jednak ważne jest, że dla zmiennej lokalnej pamięć jest deklarowana tylko w krytycznych przypadkach (gdy kończy się strona pamięci na stosie, do system doalokowuje nową), ale jest to raczej przeźroczyste dla programu i nie można tu mówić o dynamicznej alokacji.

W poprzednim komentarzu trochę niefortunnie użyłem słowa "zaalokuje", bo prawda jest taka, że ta pamięć w 99.9% przypadków już będzie dostępna, a kompilator tylko przydziela ją danej zmiennej.

Jednak muszę przyznać, że jest pewien sens w twojej argumentacji. smiley

Podobne pytania

0 głosów
2 odpowiedzi 848 wizyt
0 głosów
2 odpowiedzi 1,279 wizyt
0 głosów
1 odpowiedź 2,293 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...