mirror of
https://gitlab.com/blau_araujo/cblc.git
synced 2025-05-09 10:16:35 -03:00
Inclusão do tópico sobre VLAs
This commit is contained in:
parent
fb0c380d15
commit
aba1d32345
1 changed files with 37 additions and 6 deletions
|
@ -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 |
|
||||
|
|
Loading…
Add table
Reference in a new issue