Se a função for chamada recursivamente, as variáveis locais e parâmetros serão novamente alocados na pilha, em áreas distintas para cada nível de recursão. Isso permite preservar os valores anteriores dos mesmos no retorno dos níveis de recursão.
O exemplo a seguir permite observar a existência de múltiplas instâncias de variáveis locais (no caso, o parâmetro n
) em chamadas recursivas:
fatorial.c
#include <stdio.h>
long int fatorial (int n)
{
long int parcial ;
printf ("antes: n: %d\n", n) ;
if (n < 2)
parcial = 1 ;
else
parcial = n * fatorial (n - 1) ;
printf ("depois: n: %d, parcial: %ld\n", n, parcial) ;
return (parcial) ;
}
int main ()
{
printf ("Fatorial (6) = %ld\n", fatorial (6)) ;
return 0 ;
}
A execução gera o seguinte resultado:
antes: n: 6
antes: n: 5
antes: n: 4
antes: n: 3
antes: n: 2
antes: n: 1
depois: n: 1, parcial: 1
depois: n: 2, parcial: 2
depois: n: 3, parcial: 6
depois: n: 4, parcial: 24
depois: n: 5, parcial: 120
depois: n: 6, parcial: 720
Fatorial (6) = 720
O padrão C99 permite a alocação automática de vetores de tamanho variável, ou seja, definidos em tempo de execução. O exemplo a seguir ilustra esse conceito:
int my_function (int n)
{
char name[n] ; // aloca string com tamanho "n"
...
}
Na alocação dinâmica, o programa solicita explicitamente áreas de memória ao sistema operacional, as utiliza e depois as libera quando não forem mais necessárias, ou quando o programa encerrar. As requisições de memória dinâmica são geralmente alocadas na área de memória denominada heap.