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.

  • 🗂️. Cztery klasy pamięci masowej: Język C udostępnia specyfikatory auto, register, static i extern służące do opisu każdej zmiennej.
  • 🏠 Auto: Domyślna klasa lokalna, ograniczona do swojego bloku i przechowująca bezużyteczną wartość do momentu przypisania.
  • Zarejestrować: Żąda przechowywania danych w rejestrach procesora w celu szybszego dostępu do często używanych zmiennych, takich jak liczniki.
  • ♻️ Statyczny: Zachowuje wartość zmiennej pomiędzy wywołaniami funkcji i przy pierwszym użyciu przyjmuje wartość domyślną zero.
  • 🌐 Zewnętrzny: Udostępnia zmienną globalną lub funkcję wielu plikom źródłowym bez konieczności jej ponownego definiowania.
  • 📊 Zakres i czas trwania: Każda klasa określa, gdzie zmienna jest widoczna i jak długo istnieje.

Klasy pamięci w C

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ź

Utwórz nowy projekt w Code Bloki

Krok 2) Wybierz C i kliknij Dalej

Wybierz język C

Krok 3) Kliknij Dalej

Kliknij Dalej

Krok 4) Wprowadź dane i kliknij Dalej

Wprowadź szczegóły projektu

Krok 5) Kliknij Zakończ

Kliknij Zakończ

Krok 6) Umieść kod główny, jak pokazano w poprzednim programie, w pliku main.c i zapisz go

Dodaj kod do main.c

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.

Utwórz oryginalny plik.c

Krok 8) Wstaw i zapisz kod C oryginalnego pliku .c pokazanego w poprzednim przykładzie bez funkcji main().

Dodaj kod do original.c

Krok 9) Zbuduj i uruchom swój projekt. Wynik pokazano na poniższym rysunku.

Dane wyjściowe programu

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

FAQ

Zakres decyduje, gdzie zmienna jest widoczna w kodzie, a czas życia decyduje, jak długo pozostaje w pamięci. Zmienna może mieć zasięg blokowy, a jednocześnie czas życia równy całemu programowi.

Oba tworzą zmienne lokalne o zasięgu bloku, ale automatycznie przechowują je w pamięci z domyślną wartością śmieci, podczas gdy register żąda szybszego przechowywania danych w rejestrach procesora i zabrania pobierania adresu zmiennej.

Nie. Rejestr to tylko żądanie; kompilator może je zignorować, jeśli żaden rejestr nie jest wolny. Nowoczesne kompilatory automatycznie optymalizują użycie rejestrów, więc słowo kluczowe jest obecnie rzadko potrzebne.

Zmienne statyczne i zewnętrzne znajdują się w segmencie pamięci inicjowanym zerem przez cały program, więc zaczynają od zera. Zmienne automatyczne ponownie wykorzystują pamięć stosu,ping jakiekolwiek wartości pozostały.

Deklaracja extern jedynie ogłasza zmienną zdefiniowaną gdzie indziej i nie może zostać zainicjowana. Prawdziwa definicja, w jednym pliku, przydziela pamięć, a linkowanie łączy wszystkie odwołania do niej.

W większości, ale nie do końca. C++ wycofano słowo kluczowe register i przeznaczono auto do wnioskowania typu. Zmienne static i extern zachowują się podobnie, C++ dodaje reguły thread_local i przechowywania elementów klasy.

Tak. Asystenci AI opisują zmienne: auto, register, static i extern, sugerują właściwy specyfikator dla każdej zmiennej i sygnalizują niewłaściwe użycie, takie jak pobranie adresu zmiennej register.

Drugi pilot GitHub automatycznie uzupełnia liczniki statyczne, deklaracje zewnętrzne w plikach i wskazówki dotyczące rejestrów, a następnie wyjaśnia zakres i czas życia w trakcie pisania.

Podsumuj ten post następująco: