Klasy pamięci w C: Auto, Extern, Static, Register (przykłady)
⚡ Inteligentne podsumowanie
Klasy pamięci masowej w języku C definiują zakres, czas życia, wartość domyślną i lokalizację w pamięci każdej zmiennej, używając czterech specyfikatorów — auto, register, static i extern — aby kontrolować, gdzie znajdują się dane i jak długo są one zachowywane podczas wykonywania.

Co to jest klasa pamięci w C?
Klasa pamięci masowej reprezentuje widoczność i lokalizację zmiennej. Informuje, z której części kodu możemy uzyskać dostęp do zmiennej. Klasa pamięci masowej w C jest używana do opisywania następujących rzeczy:
- Zakres zmienny.
- Lokalizacja, w której zmienna będzie przechowywana.
- Zainicjowana wartość zmiennej.
- Czas życia zmiennej.
- Kto może uzyskać dostęp do zmiennej?
Zatem klasa pamięci jest używana do reprezentowania informacji o zmiennej.
UWAGA: Zmienna nie jest powiązana tylko z typ danych, jego wartość, ale także klasa przechowywania.
Jakie są typy klas pamięci w C?
Istnieją w sumie cztery typy standardowych klas przechowywania. Poniższa tabela przedstawia klasy pamięci w języku C.
| Klasa pamięci | Cel |
| samochód | Jest to domyślna klasa pamięci. |
| zewnętrzny | Jest to zmienna globalna. |
| statyczny | Jest to zmienna lokalna, która może zwrócić wartość nawet wtedy, gdy sterowanie zostanie przekazane wywołaniu funkcji. |
| zarejestrować | Jest to zmienna przechowywana w rejestrze. |
Klasa automatycznego przechowywania w C
Zmienne zdefiniowane przy użyciu klasy automatycznego przechowywania nazywane są zmiennymi lokalnymi. Auto oznacza automatyczną klasę przechowywania. Zmienna domyślnie znajduje się w klasie automatycznego przechowywania, jeśli nie została wyraźnie określona.
Zakres zmiennej auto jest ograniczony tylko do konkretnego bloku. Gdy kontrola wychodzi poza blok, dostęp zostaje zniszczony. Oznacza to, że tylko blok, w którym zmienna auto jest zadeklarowana, może uzyskać do niej dostęp.
Słowo kluczowe auto służy do definiowania klasy pamięci automatycznej. Domyślnie zmienna automatyczna zawiera wartość śmieciową.
Example, auto int age;
Poniższy program definiuje funkcję posiadającą dwie zmienne lokalne
int add(void) { int a=13; auto int b=48; return a+b;}
Bierzemy inny program, który pokazuje poziom zakresu „poziom widoczności” dla zmiennych automatycznych w każdym kodzie blokowym, które są względem siebie niezależne:
#include <stdio.h> int main( ) { auto int j = 1; { auto int j= 2; { auto int j = 3; printf ( " %d ", j); } printf ( "\t %d ",j); } printf( "%d\n", j);}
Wyjście:
3 2 1
Klasa pamięci zewnętrznej w języku C
Extern oznacza klasę pamięci zewnętrznej. Klasa pamięci zewnętrznej jest używana, gdy mamy funkcje lub zmienne globalne, które są współdzielone między dwoma lub większą liczbą plików.
Słowo kluczowe extern służy do deklarowania zmiennej lub funkcji globalnej w innym pliku w celu zapewnienia odniesienia do zmiennej lub funkcji, która została już zdefiniowana w oryginalnym pliku.
Zmienne zdefiniowane za pomocą słowa kluczowego extern nazywane są zmiennymi globalnymi. Zmienne te są dostępne w całym programie. Zauważ, że zmienna extern nie może zostać zainicjowana, ponieważ została już zdefiniowana w oryginalnym pliku.
Example, extern void display();
Pierwszy plik: main.c
#include <stdio.h> extern i; main() { printf("value of the external integer is = %d\n", i); return 0;}
Drugi plik: oryginał.c
#include <stdio.h>
i=48;
Wynik:
value of the external integer is = 48
Aby skompilować i uruchomić powyższy kod, wykonaj poniższe kroki
Krok 1) Utwórz nowy projekt,
- Wybierz aplikację konsolową
- Kliknij Przejdź
Krok 2) Wybierz C i kliknij Dalej
Krok 3) Kliknij Dalej
Krok 4) Wprowadź dane i kliknij Dalej
Krok 5) Kliknij Zakończ
Krok 6) Umieść kod główny, jak pokazano w poprzednim programie, w pliku main.c i zapisz go
Krok 7) Utwórz nowy plik C [Plik -> Nowy -> Pusty plik], zapisz (jako original.c) i dodaj go do bieżącego projektu, klikając „OK” w oknie dialogowym.
Krok 8) Wstaw i zapisz kod C oryginalnego pliku .c pokazanego w poprzednim przykładzie bez funkcji main().
Krok 9) Zbuduj i uruchom swój projekt. Wynik pokazano na poniższym rysunku.
Klasa pamięci statycznej w języku C
Zmienne statyczne są używane w funkcji/pliku jako lokalne zmienne statyczne. Można je również wykorzystać jako zmienna globalna
- Statyczna zmienna lokalna to zmienna lokalna, która zachowuje i przechowuje swoją wartość pomiędzy wywołaniami funkcji lub blokiem i pozostaje widoczna tylko dla funkcji lub bloku, w którym jest zdefiniowana.
- Zmienne globalne statyczne to zmienne globalne widoczne tylko w pliku, w którym zostały zadeklarowane.
Example: static int count = 10;
Należy pamiętać, że zmienna statyczna ma domyślną wartość początkową zero i jest inicjowana tylko raz w ciągu swojego życia.
#include <stdio.h> /* function declaration */ void next(void); static int counter = 7; /* global variable */ main() { while(counter<10) { next(); counter++; } return 0;} void next( void ) { /* function definition */ static int iteration = 13; /* local static variable */ iteration ++; printf("iteration=%d and counter= %d\n", iteration, counter);}
Wynik:
iteration=14 and counter= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
Zmienne globalne są dostępne w całym pliku, natomiast zmienne statyczne są dostępne tylko dla określonej części kodu.
Żywotność zmiennej statycznej jest zawarta w całym kodzie programu. Zmienna zadeklarowana lub zainicjowana przy użyciu słowa kluczowego static zawsze zawiera zero jako wartość domyślną.
Zarejestruj klasę pamięci w C
Możesz użyć klasy przechowywania rejestrów, jeśli zamiast tego chcesz przechowywać zmienne lokalne w funkcjach lub blokach w rejestrach procesora RAM aby mieć szybki dostęp do tych zmiennych. Na przykład „liczniki” są dobrym kandydatem do przechowywania w rejestrze.
Example: register int age;
Słowo kluczowe „register” służy do deklarowania klasy pamięci rejestru. Zmienne zadeklarowane za pomocą klasy pamięci rejestru mają okres ważności w całym programie.
Jest ona podobna do klasy automatycznego przechowywania. Zmienna jest ograniczona do konkretnego bloku. Jedyna różnica polega na tym, że zmienne zadeklarowane przy użyciu klasy przechowywania rejestrów są przechowywane w rejestrach procesora, a nie w pamięci. Rejestr ma szybszy dostęp niż pamięć główna.
Zmienne zadeklarowane przy użyciu klasy przechowywania rejestrów nie mają wartości domyślnej. Zmienne te są często deklarowane na początku programu.
#include <stdio.h> /* function declaration */ main() { {register int weight; int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/} }
Wyjście:
error: address of register variable 'weight' requested
W poniższej tabeli podsumowano główne cechy każdej klasy pamięci masowej, które są powszechnie używane w programowaniu w języku C.
| Klasa przechowywania | Deklaracja | Dyski | Domyślna wartość początkowa | Zakres | Życie |
| samochód | Wewnątrz funkcji/bloku | Pamięć | Nieobliczalny | W obrębie funkcji/bloku | W obrębie funkcji/bloku |
| zarejestrować | Wewnątrz funkcji/bloku | Rejestry procesora | Śmieci | W obrębie funkcji/bloku | W obrębie funkcji/bloku |
| zewnętrzny | Poza wszystkimi funkcjami | Pamięć | Zero | Cały plik i inne pliki, w których zmienna jest zadeklarowana jako extern | czas wykonania programu |
| Statyczne (lokalne) | Wewnątrz funkcji/bloku | Pamięć | Zero | W obrębie funkcji/bloku | czas wykonania programu |
| Statyczne (globalne) | Poza wszystkimi funkcjami | Pamięć | Zero | Globalny | czas wykonania programu |








