Programação C

Operador Sizeof em linguagem C

Operador Sizeof em linguagem C
Neste artigo, vamos aprender sobre o operador sizeof em C. É um operador unário amplamente utilizado no desenvolvimento de software embarcado, o que nos ajuda a descobrir o tamanho do operando. Portanto, o valor de retorno do operador sizeof nos ajuda a entender o número de bytes alocados na memória do computador para conter a variável ou tipo de dados específico.

Compreendendo o tamanho de:

Antes de mergulharmos no tamanho da discussão do operador, vamos primeiro entender o significado do operador. Um operador é representado por um token ou símbolo que é usado para realizar uma operação como adição, subtração, multiplicação, divisão, etc. sobre valores ou variáveis ​​(operandos). Por exemplo, “*” é o símbolo usado para representar a operação de multiplicação e funciona em dois operandos (resultado = a * b;). Este é um exemplo de operador binário.

No entanto, se um operador trabalha com apenas um operando, chamamos esse operador de operador unário. O operador sizeof é um dos operadores unários que existem na linguagem de programação C e, aparentemente, opera apenas em um operando. O operador sizeof retorna o tamanho do operando. Isso significa que, a partir do valor de retorno do operador Sizeof, podemos dizer claramente quantos bytes alocados para conter o operando específico na memória do computador.

A memória de um computador é uma coleção de unidades de memória (i.e. byte). Quando sizeof (int) retorna quatro em um sistema de computador específico, podemos dizer que uma variável inteira leva 4 bytes para manter seu valor na memória desse sistema de computador específico. Além disso, observe que o valor de retorno do operador sizeof também depende das máquinas que você está usando (sistema de 32 bits ou sistema de 64 bits).

Sintaxe:

Tamanho de (tipo)
Sizeof (expressão)

O tipo de retorno de sizeof é size_t.

Exemplos:

Agora, uma vez que entendemos o operador sizeof e conhecemos a sintaxe, vamos dar uma olhada em alguns exemplos, que nos ajudarão a entender o conceito de uma maneira melhor.

Sizeof para tipos integrados (exemplo1.c):

Neste programa, veremos como o operador sizeof funciona para tipos de dados integrados, como int, char, float, double. Vejamos o programa e a saída.

#incluir
int main ()

printf ("Tamanho de char =% ld \ n", sizeof (char));
printf ("Tamanho de int =% ld \ n", sizeof (int));
printf ("Tamanho do float =% ld \ n", sizeof (float));
printf ("Tamanho duplo =% ld \ n \ n", sizeof (duplo));
printf ("Tamanho do short int =% ld \ n", sizeof (short int));
printf ("Tamanho do int longo =% ld \ n", sizeof (int longo));
printf ("Tamanho do int longo longo =% ld \ n", sizeof (int longo longo));
printf ("Tamanho do duplo longo =% ld \ n", sizeof (duplo longo));
return 0;

Sizeof for Array (exemplo2.c)

Neste programa, veremos como usar o operador sizeof para diferentes tipos de array. No caso de uma matriz, o operador sizeof retornará (Não. de elementos na matriz * Sizeof (tipo de matriz)). Por exemplo, quando declaramos uma matriz de tipo inteiro de 10 elementos (int SmartPhones [10];), o sizeof (Smartphones) retornará:

(Não. de elementos em SmartPhones * sizeof (int)) = (10 * 4) = 40

Vejamos o programa e a saída.

#incluir
int main ()

int SmartPhones [10];
char SmartPhoneNames [10];
SmartPhonesPrice duplo [10];
printf ("Tamanho de int =% ld \ n", sizeof (int));
printf ("Tamanho do char =% ld \ n", sizeof (char));
printf ("Tamanho duplo =% ld \ n", sizeof (duplo));
/ * Descubra o tamanho do Array * /
printf ("Tamanho dos SmartPhones [10] =% ld \ n", sizeof (SmartPhones));
printf ("Tamanho de SmartPhoneNames [10] =% ld \ n", sizeof (SmartPhoneNames));
printf ("Tamanho de SmartPhonesPrice [10] =% ld \ n", sizeof (SmartPhonesPrice));
return 0;

Sizeof para tipos definidos pelo usuário (exemplo 3.c):

Neste exemplo, veremos como usar o operador sizeof para tipos de dados definidos pelo usuário, como estrutura e união. Vamos usar o programa e entender a saída.

Agora, olhando para o programa, podemos calcular manualmente o tamanho do SmartPhoneType. Como você pode ver abaixo, SmartPhoneType é uma estrutura e contém os seguintes elementos:

  • Número da variável de tipo de caractere = 1 [sp_name]
  • Número da variável de tipo inteiro = 1 [sp_version]
  • Número de variáveis ​​de tipo flutuante = 3 [sp_length, sp_width, sp_height]

No exemplo 1, vimos que:

    • O tamanho do caractere é de 1 byte
    • O tamanho de um inteiro é 4 bytes
    • O tamanho de um flutuador é 4 bytes

Portanto, se somarmos o tamanho de todos os elementos na estrutura, devemos ser capazes de obter o tamanho da estrutura, i.e. SmartPhoneType. Portanto, o tamanho da estrutura deve ser = (1 + 4 + 4 + 4 + 4) bytes = 17 bytes. No entanto, a saída do programa diz que o tamanho da estrutura é 20. Os 3 bytes extras (sp_name, que é um caractere, ocupa 4 bytes em vez de 1 byte) alocados para a estrutura devido ao preenchimento da estrutura.

#incluir
/ * Cria um tipo de estrutura definida pelo usuário - SmartPhoneType * /
struct SmartPhoneType

char sp_name;
int sp_version;
float sp_length;
float sp_width;
float sp_height;
Smartphone;
/ * Definir um tipo de união definido pelo usuário - SmartPhoneUnionType * /
Union SmartPhoneUnionType

char sp_name;
int sp_version;
float sp_length;
float sp_width;
float sp_height;
SmartPhone_u;
int main ()

/ * Descubra o tamanho da estrutura e união * /
printf ("Tamanho da estrutura =% ld \ n", sizeof (SmartPhone));
printf ("Tamanho da união =% ld \ n", sizeof (SmartPhone_u));
return 0;

Sizeof para variáveis ​​(exemplo 4.c):

Este programa de exemplo ilustra que o operador sizeof é capaz de aceitar a variável também e retornar o tamanho da variável.

#incluir
int main ()

/ * Declara variável de tipo char, int, float e double e array * /
char var_a, var_b [20];
int var_c, var_d [20];
float var_e, var_f [20];
duplo var_g, var_h [20];
/ * Descubra o tamanho das variáveis ​​e array.
Este programa demonstra que a variável também pode
ser usado como um operando sizeof operator * /
/ * tamanho de char, char variable e char array * /
printf ("Tamanho do char =% ld \ n", sizeof (char));
printf ("Tamanho de var_a =% ld \ n", sizeof (var_a));
printf ("Tamanho de var_b [20] =% ld \ n \ n", sizeof (var_b));
/ * tamanho de int, variável int e array int * /
printf ("Tamanho de int =% ld \ n", sizeof (int));
printf ("Tamanho de var_c =% ld \ n", sizeof (var_c));
printf ("Tamanho de var_d [20] =% ld \ n \ n", sizeof (var_d));
/ * tamanho do flutuante, variável flutuante e matriz flutuante * /
printf ("Tamanho do float =% ld \ n", sizeof (float));
printf ("Tamanho de var_e =% ld \ n", sizeof (var_e));
printf ("Tamanho de var_f [20] =% ld \ n \ n", sizeof (var_f));
/ * tamanho de double, double variable e double array * /
printf ("Tamanho duplo =% ld \ n", sizeof (duplo));
printf ("Tamanho de var_g =% ld \ n", sizeof (var_g));
printf ("Tamanho de var_h [20] =% ld \ n", sizeof (var_h));
return 0;

Tamanho da expressão (exemplo 5.c):

Neste programa de exemplo, demonstraremos que o operador sizeof também pode aceitar uma expressão e retornar o tamanho da expressão resultante.

#incluir
int main ()

int var_a = 5, var_b = 3;
double var_c = 2.5, var_d = 4.5;
printf ("Tamanho de int =% ld \ n", sizeof (int));
printf ("Tamanho duplo =% ld \ n \ n", sizeof (duplo));
printf ("Tamanho de var_a * var_b =% ld \ n", sizeof (var_a * var_b));
printf ("Tamanho de var_c * var_d =% ld \ n", sizeof (var_c * var_d));
/ * Aqui estamos multiplicando uma variável inteira por uma variável dupla.
Portanto, o operador sizeof retornará o tamanho do tamanho máximo
variável i.e. variável de tipo duplo.* /
printf ("Tamanho de var_a * var_c =% ld \ n", sizeof (var_a * var_c));
return 0;

Uso prático de sizeof (exemplo 6.c):

Este programa de exemplo irá ajudá-lo a entender um caso de uso prático do operador sizeof. O operador Sizeof é muito útil ao alocar a memória dinâmica do heap usando malloc. Vejamos o programa e a saída.

#incluir
#incluir
estrutura de typedef

char sp_name;
int sp_version;
float sp_length;
float sp_width;
float sp_height;
SmartPhoneType;
int main ()

/ * Alocar memória na memória Heap para armazenar cinco SmartPhoneType
variáveis.
* /
SmartPhoneType * SmartPhone_Ptr = (SmartPhoneType *) malloc (5 * sizeof (SmartPhoneType));
if (SmartPhone_Ptr != NULL)

printf ("Memória alocada para 5 variáveis ​​de estrutura SmartPhoneType em
a memória Heap.\ n ");

senão

printf ("Ocorreu um erro durante a atribuição da memória heap!");

return 0;

Conclusão:

O Sizeof é um importante operador unário na linguagem de programação C. Isso nos ajuda a determinar o tamanho dos tipos de dados primitivos, tipos de dados definidos pelo usuário, expressões, etc. na memória do computador. O operador Sizeof desempenha um papel importante na alocação de memória dinâmica em C usando malloc, calloc, etc. na memória Heap.

Melhores jogos de linha de comando para Linux
A linha de comando não é apenas sua maior aliada ao usar o Linux - ela também pode ser uma fonte de entretenimento porque você pode usá-la para jogar ...
Melhores aplicativos de mapeamento de gamepad para Linux
Se você gosta de jogar no Linux com um gamepad em vez de um teclado típico e sistema de entrada de mouse, existem alguns aplicativos úteis para você. ...
Ferramentas úteis para jogadores de Linux
Se você gosta de jogar no Linux, é provável que tenha usado aplicativos e utilitários como Wine, Lutris e OBS Studio para melhorar a experiência de jo...