W języku C zmienne z automatycznym obszarem przechowywania (auto, domyślnie) są tworzone na stosie w momencie wejścia w obszar ich widoczności (zwykle — funkcja) i automatycznie niszczone przy wyjściu z niej.
Do szczególnych cech należą:
Przykład poprawnego i niepoprawnego użycia:
int* wrong() { int x = 42; return &x; // BŁĄD: x zostanie zniszczone po wyjściu z funkcji } void correct() { int y = 123; printf("%d\n", y); // wszystko w porządku }
Co się stanie, jeśli zwrócimy z funkcji adres lokalnej zmiennej?
Częsty błędny odpowiedź: „Wskaznik zachowa wartość”.
Poprawna odpowiedź: Zwrócony adres stanie się nieważny po wyjściu z funkcji, obszar pamięci zostanie ponownie przydzielony innym zmiennym automatycznym lub funkcjom. Użycie takiego wskaźnika — nieokreślone zachowanie.
Przykład:
int* myfunc() { int temp = 10; return &temp; // temp zostaje zniszczone po zwrocie } int main() { int* p = myfunc(); printf("%d\n", *p); // NIEOKREŚLONE ZACHOWANIE }
Historia
Historia
Historia
W oprogramowaniu rejestratora medycznego wprowadzono pamięć podręczną na stosie w celu przyspieszenia przetwarzania danych. Pod obciążeniem stos przepełniał się, co prowadziło do restartu urządzenia i utraty danych pacjenta.