Variable Length Arrays

Essa foi uma descoberta recente do MaRZ que achei muito interessante: O padrão C99, da linguagem C, permite a declaração de arrays de tamanho variável. Suponha que você queira alocar um array numa variável local (e, portanto, na pilha). Uma forma de fazer isso é esta:

void f(int size)
{
  char *p;

  p = (char *)alloca(size);
  /* ... usa o ponteiro 'p' aqui ... */
}

A função alloca não faz outra coisa além de alocar um espaço na pilha (ao invés do heap) e devolver o ponteiro da primeira posição desse bloco. Repare que não é necessário chamar free para liberar o bloco de memória, já que, no retorno da função, esse bloco será descartado.

Só que, segundo as especificações C89 e C99, a função alloca não está disponível para todas as plataformas. Lembre-se que gcc é um compilador que funciona em multiplas plataformas!

Para tentar solucionar isso o padrão C99 implementa os VLAs (Variable Length Arrays). A função acima pode ser escrita como:

void f(int size)
{
  char p[size];

  /* Usa o array 'p' aqui... */
}

Notaram que, na declaração, o tamanho do array é dado pela variável ‘size’? Interessante, não?

Você pode pensar, como eu pensei inicialmente, que a função alloca tem mais vantagens do que os VLAs… Eu estava errado! Acontece que se alloca não conseguir alocar espaço na pilha ele não retornará NULL, como é o caso de malloc e suas derivadas. O comportamento de alloca no caso da pilha exaurida é indefinido — que, no jargão das especificações, pode ser traduzido por “isso pode dar merda!”. O mesmo problema ocorre com as VLAs.

Então VLAs são, na verdade, uma vantagem em relação ao alloca. Mas só funciona com compiladores que implementam a especificação C99!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s