diff --git a/aulas/07-vps/README.org b/aulas/07-vps/README.org index 6468639..7c1d6cb 100644 --- a/aulas/07-vps/README.org +++ b/aulas/07-vps/README.org @@ -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 |