Classes de armazenamento em C: diferentes tipos de classes de armazenamento [com exemplos]
Publicados: 2020-10-21A codificação com C é altamente centrada no uso de variáveis em todos os programas. Esses são os principais aspectos da programação C. Cada variável em C tem duas propriedades; tipo e classes de armazenamento. Entre eles, o tipo refere-se ao tipo de dados da variável, e as classes de armazenamento em C determinam o escopo, o tempo de vida e a visibilidade da variável. As classes de armazenamento em C são usadas para encontrar o tempo de vida, visibilidade, localização da memória e valor inicial de uma variável.
Nesta postagem do blog, veremos detalhadamente as classes de armazenamento em C , seus tipos e como suas características influenciam a saída do programa com alguns exemplos de programação. Uma classe de armazenamento em C é usada para representar a informação de uma variável.
Aprenda a criar aplicativos como Swiggy, Quora, IMDB e muito mais
Índice
O que são classes de armazenamento em C?
As classes de armazenamento em C alocam a área de armazenamento de uma variável que será retida na memória. Eles são armazenados na RAM de um sistema. Além do espaço de armazenamento, eles determinam o escopo de uma variável. As variáveis no programa C são armazenadas em um local físico na memória aleatória, que é principalmente a memória do dispositivo e os registradores da CPU.
As classes de armazenamento em C também definem o tempo de vida da variável e a denominam como 'local' ou 'global'. As classes de armazenamento também são úteis para definir o escopo ou visibilidade e o valor inicial da variável. Existem basicamente quatro classes de armazenamento em C , viz. automático , registrador , estático e externo . Discutiremos cada um mais um por um.
Como as classes de armazenamento em C são declaradas?
As quatro classes de armazenamento em C são declaradas em um bloco ou programa com os especificadores de classe de armazenamento, auto, registrador, extern, static. Há mais um especificador de classe de armazenamento, 'typedef' usado na forma sintática e não reserva armazenamento. Os especificadores instruem o compilador sobre como armazenar as variáveis. A classe de armazenamento externo em C informa ao compilador que a variável definida é declarada com ligação externa.

Há uma diferença fundamental entre definir e declarar uma variável. Definir uma variável é alocar a memória para a variável e declará-la significa inicializá-la com um valor.
Sintaxe:
storage_class_specifier data_type nome_variável;
Leia: Ideias e tópicos de projetos interessantes em C# para iniciantes
Caso especial: quando nenhum especificador de classe de armazenamento é declarado ou definido em um programa
Há pelo menos um especificador de classe de armazenamento fornecido na declaração da variável. Mas, caso não haja especificador de classe de armazenamento especificado, as seguintes regras são seguidas:
1. As variáveis declaradas dentro de uma função são consideradas como automáticas.
2. As funções declaradas dentro de uma função são consideradas externas.
3. Variáveis e funções declaradas fora de uma função são consideradas estáticas, com ligação externa .
Quais são os tipos de classes de armazenamento em C?
Existem quatro classes de armazenamento em C , vamos dar uma olhada nelas:
1. Classes de armazenamento automático em C
Toda variável definida em uma função ou bloco pertence à classe de armazenamento automático por padrão se não houver nenhuma classe de armazenamento mencionada. As variáveis de uma função ou bloco pertencentes à classe de armazenamento automático são declaradas com o especificador auto. As variáveis em auto em C são locais ao bloco onde são definidas e são descartadas fora do bloco.

Um programa simples mostrando classes de armazenamento automático:
#include <stdio.h>
int main()
{
autoint i = 11;
{
autoint i = 22;
{
autoint i = 33;
printf ("%d",i);
}
printf ("%d",i);
}
printf ("%d",i);
}
A saída do programa:
3 2 1
Explicação:
No programa acima, há três vezes que a variável i é declarada. Variáveis com o mesmo nome podem ser definidas em blocos diferentes. Assim, este programa irá compilar e executar com sucesso sem nenhum erro. A função 'printf' no bloco mais interno imprimirá 3 e a variável i neste bloco será destruída após o término do bloco.
O próximo, o segundo bloco externo imprime 2 que é sucedido pelo bloco externo que imprime 1. As variáveis automáticas são inicializadas corretamente; caso contrário, você obterá valores indefinidos, pois o compilador não fornece um valor inicial.
2. Registrar Classes de Armazenamento em C
As variáveis pertencentes a uma classe de armazenamento de registradores são equivalentes a auto em C, mas são armazenadas em registradores da CPU e não na memória, daí o nome. Eles são os acessados com frequência. O especificador de registro é usado para declarar a variável da classe de armazenamento de registro. As variáveis de uma classe de armazenamento de registradores são locais ao bloco onde são definidas e destruídas quando o bloco termina.
Um programa simples mostrando classes de armazenamento de registro:
#include <stdio.h>
int main()
{
registrador int = 10;
int *p = &i; //erro: endereço da variável de registro solicitada
printf (“Valor de i: %d”, *p);
printf (“Endereço de i: %u”, p);
}
Explicação:
No programa acima, o código tenta obter o endereço da variável i na variável ponteiro p, mas como i é declarado como uma variável de registro, o código não compilará e exibirá o erro ” Erro: endereço da variável de registro solicitada” .
Apenas certos tipos de variáveis são colocados em registradores. As variáveis de registro não recebem um valor inicial do compilador.
Aprenda: C++ vs Java: diferença entre C++ e Java
3. Classes de armazenamento estático em C
A visibilidade de variáveis estáticas é zero fora de sua função ou arquivo, mas seus valores são mantidos entre as chamadas. As variáveis com classe de armazenamento estática são declaradas com o especificador estático. Variáveis estáticas estão dentro de uma função ou arquivo. O especificador estático funciona de forma diferente com variáveis locais e globais.
Programas simples mostrando classes de armazenamento estático com variáveis locais e globais:
eu. Variável Local
#include <stdio.h>
void staticDemo()
{
estático int;
{
int estático i = 1;
printf ("%d", i);
i++;
}
printf (“%d”, i);
i++;
}
int main()
{
staticDemo();
staticDemo();
}
A saída do programa:
1 0
2 1
Explicação:
Quando uma variável local é definida por um especificador estático, dentro de uma função ou bloco, um espaço de armazenamento permanente é criado no compilador. A variável local estática é visível para a função ou bloco onde é especificada e retém seu valor entre as chamadas da função. No programa acima, a variável estática i é definida em dois lugares em dois blocos dentro da função staticDemo(). staticDemo() é chamado dois na função principal. Na próxima chamada, as variáveis estáticas mantêm seus valores antigos e não precisam ser inicializadas novamente.
ii. Variável Global
#include <stdio.h>
static int gInt = 1;
static void staticDemo()
{
estático int;
printf ("%d", i);
i++;
printf (“%d”, globalInt);
globalInt++;
}
int main()
{
staticDemo();
staticDemo();
}
A saída do programa:
0 1
1 2
Explicação:
As variáveis estáticas precisam ser inicializadas apenas uma vez em um programa e são retidas durante toda a vida útil. Eles têm um valor inicial padrão de zero.
Quando uma variável ou função global é definida por um especificador estático, essa variável ou função é conhecida apenas pelo arquivo em que está definida. Para uma variável global, outras rotinas de arquivo não podem acessar e alterar seu conteúdo, pois uma variável global estática tem ligação interna. No programa acima, a variável global estática globalInt e uma função estática staticDemo() são definidas como estáticas e não podem ser usadas fora do arquivo C.
4. Classes de armazenamento externo em C
Variáveis ou funções de classe de armazenamento externo são declaradas pelo especificador 'extern'. Quando uma variável é declarada com o especificador extern, nenhum armazenamento é alocado para a variável e assume-se que ela já foi definida em outro lugar no programa. Com um especificador externo, a variável não é inicializada. A razão pela qual extern é usado para especificar uma variável em um programa para declará-lo com ligação externa.
Um programa simples mostrando classes de armazenamento externo:
#include <stdio.h>
externo int;
int main()
{
printf (“i: %d”, i);
}
int = 1;
Explicação:

No programa C acima, se extern int i for removido, ocorrerá um erro “Identificador não declarado 'i' porque a variável i é definida após ser usada em printf. O especificador extern instrui o compilador que a variável i foi definida e declarada aqui.
Se você alterar extern int i; para extern int i = 5; você receberá um erro “Redefinição de 'i'” porque o especificador externo não inicializa uma variável.
Leia também: 7 ideias de projetos empolgantes em C para iniciantes
Palavras finais
Este artigo detalha o conceito de classes de armazenamento em C e mostra como seus tipos diferem uns dos outros. Quando usar uma determinada classe de armazenamento depende da atribuição e do escopo, tempo de vida e visibilidade da variável com a qual você está lidando.
Se você estiver interessado em aprender mais e precisar de orientação de especialistas do setor, confira o PG Diploma in Full-Stack Software Development da upGrad & IIIT Banglore.
