mirror of
https://gitlab.com/blau_araujo/cblc.git
synced 2025-05-11 02:56: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".
|
char f[] = {'o', 'i', '\0'}; // Equivale e inicializar com "oi".
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
*Nota:*
|
*Notas:*
|
||||||
|
|
||||||
Por ser uma estrutura de dados, o tipo de um vetor é frequentemente
|
- Por ser uma estrutura de dados, o "tipo" de um vetor é frequentemente descrito
|
||||||
descrito como =TIPO[TAMANHO]=. Sendo um vetor de caracteres, o tipo de
|
como =TIPO[TAMANHO]=, mas isso não é um tipo da linguagem C -- é apenas uma
|
||||||
uma string literal na memória é =char[TAMANHO]=. Quando atribuída a
|
forma utilizada para expressar a ideia de um dado que é composto por uma certa
|
||||||
uma variável, a string literal expressa o endereço de seu primeiro
|
quantidade de elementos de um determinado tipo. Sendo um vetor de caracteres,
|
||||||
byte, ou seja, o endereço de um dado do tipo =char=.
|
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