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

Deklaracja dynamicznej zmiennej

0 głosów
565 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 1,138 wizyt
0 głosów
2 odpowiedzi 1,678 wizyt
0 głosów
1 odpowiedź 2,585 wizyt

93,424 zapytań

142,422 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...