Inclusão do tópico sobre VLAs

This commit is contained in:
Blau Araujo 2025-03-29 06:02:41 -03:00
parent fb0c380d15
commit aba1d32345

View file

@ -204,10 +204,41 @@ char s[] = "mais uma"; // O endereço da string será o endereço do vetor,
char f[] = {'o', 'i', '\0'}; // Equivale e inicializar com "oi".
#+end_src
*Nota:*
*Notas:*
Por ser uma estrutura de dados, o tipo de um vetor é frequentemente
descrito como =TIPO[TAMANHO]=. Sendo um vetor de caracteres, o tipo de
uma string literal na memória é =char[TAMANHO]=. Quando atribuída a
uma variável, a string literal expressa o endereço de seu primeiro
byte, ou seja, o endereço de um dado do tipo =char=.
- Por ser uma estrutura de dados, o "tipo" de um vetor é frequentemente descrito
como =TIPO[TAMANHO]=, mas isso não é um tipo da linguagem C -- é apenas uma
forma utilizada para expressar a ideia de um dado que é composto por uma certa
quantidade de elementos de um determinado tipo. Sendo um vetor de caracteres,
uma string literal na memória, por exemplo, seria descrita como =char[TAMANHO]=.
- Quando atribuída a um elemento escalar, como uma variável, um ponteiro ou o
argumento de uma função, a string literal expressa o endereço de seu primeiro
byte, ou seja, o endereço do primeiro elemento de um vetor do tipo =char=.
** Vetores de comprimentos variáveis (VLA)
A alocação do espaço ocupado por um vetor é feita estaticamente em tempo de
compilação, o que nos impediria de declarar e inicializar vetores com uma
quantidade de elementos obtida pela avaliação de uma variável ou pelo retorno
de uma função, por exemplo: isso é chamado de VLA (/variable-length array/).
O GCC, porém, implementa o suporte a VLA na forma de uma extensão habilitada por
padrão, possibilitando a declaração de vetores com número de elementos obtidos
dinamicamente, mas não a sua inicialização:
#+begin_src c
int size = 10;
int a[size]; // Permitido no GCC...
int v[size] = {0}; // Proibido!
#+end_src
Outros compiladores podem não suportar VLAs:
| Compilador | Suporte a VLAs | Observações |
|-----------------------+----------------+------------------------------|
| *MSVC (cl.exe)* | Não suporta | Gera erro de compilação |
| *GCC (Linux/Mingw-w64)* | Suporta | VLAs alocados na pilha |
| *Clang (MinGW/WSL)* | Suporta | Mesmo comportamento do Linux |
| *Clang-cl (modo MSVC)* | Não suporta | Igual ao MSVC |