Sua variável d
normalmente não é removida da pilha. Chaves entre dentes não indicam um quadro de pilha. Caso contrário, você não seria capaz de fazer algo assim:
char var = getch();
{
char next_var = var + 1;
use_variable(next_char);
}
Se chaves entre chaves causassem um push / pop verdadeiro da pilha (como faria uma chamada de função), o código acima não seria compilado porque o código dentro das chaves não seria capaz de acessar a variável var
que vive fora das chaves (como uma sub- A função não pode acessar diretamente variáveis na função de chamada). Sabemos que esse não é o caso.
Aparelhos encaracolados são simplesmente usados para escopo. O compilador tratará qualquer acesso à variável "interna" de fora dos colchetes como inválido e poderá reutilizar essa memória para outra coisa (isso depende da implementação). No entanto, ele não pode ser retirado da pilha até que a função de fechamento retorne.
Atualização: Aqui está o que a especificação C tem a dizer. Em relação a objetos com duração de armazenamento automático (seção 6.4.2):
Para um objeto que não possui um tipo de matriz de comprimento variável, sua vida útil se estende desde a entrada no bloco ao qual está associado até a execução desse bloco terminar de qualquer maneira.
A mesma seção define o termo "tempo de vida" como (ênfase minha):
A vida útil de um objeto é a parte da execução do programa durante a qual o armazenamento é garantido como reservado para ele. Um objeto existe, tem um endereço constante e mantém seu último valor armazenado ao longo de sua vida útil. Se um objeto for referido fora de sua vida útil, o comportamento será indefinido.
A palavra-chave aqui é, obviamente, 'garantida'. Depois que você sai do escopo do conjunto interno de chaves, a vida útil da matriz termina. O armazenamento pode ou não ser ainda alocado para ele (seu compilador pode reutilizar o espaço para outra coisa), mas qualquer tentativa de acessar a matriz invoca um comportamento indefinido e produz resultados imprevisíveis.
A especificação C não tem noção de quadros de pilha. Ele fala apenas de como o programa resultante se comportará e deixa os detalhes da implementação para o compilador (afinal, a implementação seria bem diferente em uma CPU sem pilha do que em uma CPU com uma pilha de hardware). Não há nada na especificação C que determine onde um quadro de pilha terminará ou não. A única maneira real de saber é compilar o código no seu compilador / plataforma específico e examinar o assembly resultante. O conjunto atual de opções de otimização do seu compilador provavelmente também desempenhará um papel nisso.
Se você deseja garantir que a matriz d
não consuma mais memória enquanto o código está em execução, é possível converter o código entre chaves em uma função separada ou explicitamente malloc
e free
a memória em vez de usar o armazenamento automático.