Klasy pamięci w C: Różne typy klas pamięci [z przykładami]

Opublikowany: 2020-10-21

Kodowanie w C jest silnie skoncentrowane na wykorzystaniu zmiennych w każdym programie. To są kluczowe aspekty programowania w C. Każda zmienna w C ma dwie właściwości; klasy typu i przechowywania. Wśród nich typ odnosi się do typu danych zmiennej, a klasy pamięci w C określają zakres, czas życia i widoczność zmiennej. Klasy pamięci w C są używane do znajdowania czasu życia, widoczności, lokalizacji pamięci i początkowej wartości zmiennej.

W tym poście na blogu przyjrzymy się szczegółowo klasom pamięci w C , ich typom oraz temu, jak ich cechy wpływają na wynik programu na kilku przykładach programowania. Klasa pamięci w C jest używana do reprezentowania informacji o zmiennej.

Naucz się tworzyć aplikacje, takie jak Swiggy, Quora, IMDB i nie tylko

Spis treści

Jakie są klasy pamięci w C?

Klasy pamięci w C przydzielają obszar przechowywania zmiennej, który zostanie zachowany w pamięci. Są przechowywane w pamięci RAM systemu. Oprócz miejsca do przechowywania określają zakres zmiennej. Zmienne w programie C są przechowywane w fizycznej lokalizacji w pamięci losowej, która jest głównie pamięcią urządzenia i rejestrami procesora.

Klasy pamięci w języku C definiują również czas życia zmiennej i określają ją jako „lokalną” lub „globalną”. Klasy pamięci są również przydatne do definiowania zakresu lub widoczności oraz początkowej wartości zmiennej. W C są przede wszystkim cztery klasy pamięci , mianowicie. automatyczny , rejestrowy , statyczny i zewnętrzny . Omówimy każdy z osobna dalej.

Jak deklarowane są klasy pamięci w języku C?

Cztery klasy pamięci w C są zadeklarowane w bloku lub programie ze specyfikatorami klasy pamięci: auto, register, extern, static. Jest jeszcze jeden specyfikator klasy pamięci, 'typedef' używany w formie składniowej i nie rezerwuje pamięci. Specyfikatory instruują kompilator o przechowywaniu zmiennych. Klasa pamięci zewnętrznej w C informuje kompilator, że zdefiniowana zmienna jest zadeklarowana z zewnętrznym połączeniem.

Istnieje kluczowa różnica między definiowaniem a deklarowaniem zmiennej. Definiowanie zmiennej polega na przydzieleniu pamięci dla zmiennej, a zadeklarowanie jej oznacza zainicjowanie jej wartością.

Składnia:

specyfikator_klasy_magazynu typ_danych nazwa_zmiennej;

Przeczytaj: Ciekawe pomysły na projekty i tematy w C# dla początkujących

Przypadek szczególny: gdy w programie nie zadeklarowano ani nie zdefiniowano specyfikatora klasy pamięci

W deklaracji zmiennej podano co najmniej jeden specyfikator klasy pamięci. Ale w przypadku, gdy nie określono specyfikatora klasy pamięci, przestrzegane są następujące zasady:

1. Zmienne zadeklarowane w ramach funkcji traktowane są jako auto.

2. Funkcje zadeklarowane w ramach funkcji są traktowane jako zewnętrzne.

3. Zmienne i funkcje zadeklarowane poza funkcją są uważane za statyczne, z zewnętrznym powiązaniem .

Jakie są typy klas pamięci w C?

W C są cztery klasy pamięci , przyjrzyjmy się im:

1. Klasy automatycznego przechowywania w C

Każda zmienna zdefiniowana w funkcji lub bloku domyślnie należy do automatycznej klasy pamięci, jeśli nie ma w niej wymienionej klasy. Zmienne funkcji lub bloku należące do klasy automatycznego przechowywania są deklarowane za pomocą specyfikatora auto. Zmienne pod auto w C są lokalne w bloku, w którym są zdefiniowane i są odrzucane poza blokiem.

Prosty program pokazujący automatyczne klasy pamięci:

#włącz <stdio.h>

int główna( )

{

auto int i = 11;

{

auto int i = 22;

{

auto int i = 33;

printf ( „%d”, ja);

}

printf ( „%d”, ja);

}

printf ( „%d”, i);

}

Efekty Programu:

3 2 1

Wyjaśnienie:

W powyższym programie zadeklarowana jest zmienna i trzy razy. Zmienne o tej samej nazwie można definiować w różnych blokach. W ten sposób ten program skompiluje się i wykona pomyślnie bez żadnych błędów. Funkcja 'printf' w najbardziej wewnętrznym bloku wypisze 3, a zmienna i w tym bloku zostanie zniszczona po zakończeniu bloku.

Następny, drugi zewnętrzny blok drukuje 2, po którym następuje zewnętrzny blok, który drukuje 1. Zmienne automatyczne są inicjowane poprawnie; w przeciwnym razie otrzymasz niezdefiniowane wartości, ponieważ kompilator nie nadaje im wartości początkowej.

2. Zarejestruj klasy pamięci w C

Zmienne należące do klasy pamięci rejestru są równoważne auto w C , ale są przechowywane w rejestrach procesora, a nie w pamięci, stąd nazwa. To one są często odwiedzane. Specyfikator rejestru służy do deklarowania zmiennej klasy pamięci rejestru. Zmienne klasy pamięci rejestru są lokalne w bloku, w którym są zdefiniowane i niszczone po zakończeniu bloku.

Prosty program pokazujący klasy pamięci rejestru:

#włącz <stdio.h>

int main()

{

rejestr int i = 10;

int *p = &i; //błąd: adres żądanej zmiennej rejestru

printf („Wartość i: %d”, *p);

printf („Adres i: %u”, p);

}

Wyjaśnienie:

W powyższym programie kod próbuje uzyskać adres zmiennej i do zmiennej wskaźnikowej p, ale ponieważ i jest zadeklarowane jako zmienna rejestrowa, kod nie skompiluje się i wyświetli błąd „Błąd: żądany adres zmiennej rejestru” .

W rejestrach umieszczane są tylko określone typy zmiennych. Zmienne rejestru nie otrzymują wartości początkowej przez kompilator.

Dowiedz się: C++ vs Java: różnica między C++ a Java

3. Statyczne klasy pamięci w C

Widoczność zmiennych statycznych poza ich funkcją lub plikiem wynosi zero, ale ich wartości są zachowywane między wywołaniami. Zmienne ze statyczną klasą pamięci są deklarowane ze specyfikatorem static. Zmienne statyczne znajdują się w funkcji lub pliku. Specyfikator statyczny działa inaczej ze zmiennymi lokalnymi i globalnymi.

Proste programy pokazujące statyczne klasy pamięci ze zmiennymi lokalnymi i globalnymi:

i. Zmienna lokalna

#włącz <stdio.h>

void staticDemo()

{

statyczna int i;

{

statyczna int i = 1;

printf („%d”, ja);

i++;

}

printf („%d”, i);

i++;

}

int main()

{

demo statyczne();

demo statyczne();

}

Efekty Programu:

1 0

2 1

Wyjaśnienie:

Kiedy zmienna lokalna jest zdefiniowana przez specyfikator statyczny wewnątrz funkcji lub bloku, w kompilatorze tworzona jest stała przestrzeń do przechowywania. Statyczna zmienna lokalna jest widoczna dla funkcji lub bloku, w którym jest określona, ​​i zachowuje swoją wartość między wywołaniami funkcji. W powyższym programie zmienna statyczna i jest zdefiniowana w dwóch miejscach w dwóch blokach wewnątrz funkcji staticDemo(). staticDemo() nazywa się dwa w funkcji main. W następnym wywołaniu zmienne statyczne zachowują swoje stare wartości i nie muszą być ponownie inicjowane.

ii. Zmienna globalna

#włącz <stdio.h>

statyczny int gInt = 1;

static void staticDemo()

{

statyczna int i;

printf („%d”, ja);

i++;

printf („%d”, globalInt);

globalInt++;

}

int main()

{

demo statyczne();

demo statyczne();

}

Efekty Programu:

0 1

1 2

Wyjaśnienie:

Zmienne statyczne muszą być inicjowane tylko raz w programie i są zachowywane przez cały okres istnienia. Mają domyślną wartość początkową równą zero.

Kiedy zmienna globalna lub funkcja jest zdefiniowana przez statyczny specyfikator, wtedy ta zmienna lub funkcja jest znana tylko plikowi, w którym jest zdefiniowana. W przypadku zmiennej globalnej inne procedury plikowe nie mogą uzyskać dostępu do jej zawartości i zmienić jej zawartości, ponieważ statyczna zmienna globalna ma wewnętrzne połączenie. W powyższym programie statyczna zmienna globalna globalInt oraz statyczna funkcja staticDemo() są zdefiniowane jako statyczne i nie mogą być używane poza plikiem C.

4. Klasy pamięci zewnętrznej w C

Zmienne lub funkcje klasy pamięci zewnętrznej są deklarowane przez specyfikator „extern”. Gdy zmienna jest zadeklarowana ze specyfikatorem extern, do zmiennej nie jest przydzielona pamięć i zakłada się, że została już zdefiniowana w innym miejscu programu. W przypadku specyfikatora extern zmienna nie jest inicjowana. Powód, dla którego extern jest używany do określenia zmiennej w programie, aby zadeklarować ją z zewnętrznym połączeniem.

Prosty program pokazujący zewnętrzne klasy pamięci:

#włącz <stdio.h>

zewn. wewn.;

int main()

{

printf („i: %d”, i);

}

int i = 1;

Wyjaśnienie:

W powyższym programie C, jeśli extern int i zostanie usunięty, pojawi się błąd „Niezadeklarowany identyfikator 'i', ponieważ zmienna i jest zdefiniowana po użyciu w printf. Specyfikator extern informuje kompilator, że zmienna i została zdefiniowana i jest tu zadeklarowana.

Jeśli zmienisz extern int i; zewn. wewn. i = 5; otrzymasz błąd „Redefinicja „i””, ponieważ specyfikator extern nie inicjuje zmiennej.

Przeczytaj także: Top 7 ekscytujących pomysłów na projekty w C dla początkujących

Ostatnie słowa

W tym artykule szczegółowo opisano koncepcję klas pamięci w języku C i wyjaśniono, jak różnią się od siebie ich typy. Kiedy używać określonej klasy pamięci, zależy od przypisania i zakresu, czasu życia i widoczności zmiennej, z którą masz do czynienia.

Jeśli chcesz dowiedzieć się więcej i potrzebujesz mentoringu ze strony ekspertów branżowych, zapoznaj się z dyplomem PG upGrad i IIIT Banglore w zakresie programowania pełnego stosu .

Przygotuj się na karierę przyszłości

AKTUALIZACJA I DYPLOM PG IIIT-BANGALORE W ROZWOJU OPROGRAMOWANIA PEŁNEGO STOSOWANIA
Zapisz się dzisiaj