Gestão de Memória (exemplo com pilha)

From Wiki**3

Este exemplo faz uso de uma pilha de strings para armazenar dados lidos da linha de comando.

A função processa_linha_de_comandos processa e armazena os dados de entrada.

 void processa_linha_de_comandos(int argc, char **argv) {
   unsigned ax;
   unsigned char falhei = 0;
   printf("Há %d argumentos na linha de comandos...\n", argc-1);
   for (ax = 1; ax < argc; ax++) {
     char *arg = argv[ax];
     printf("Vou guardar o %dº argumento: %s... \t", ax, arg);
     if (push(arg) != FALHA) printf("consegui!!\n");
     else {
       printf("falhei! Vou ignorar os restantes %d argumentos.\n",
              argc - ax);
       falhei = 1;
       break;
     }
   }
   if (!falhei) printf("Uff! Guardei tudo: a pilha tem %d elementos.\n",
                       nframes());
   else printf("Não consegui guardar a partir do %dº argumento (%s).\n",
               ax, argv[ax]);
 }

A função main, depois de processar os dados de entrada (ver acima), apresenta o conteÃ?ºdo da pilha de armazenamento. Notar o uso de free (a reserva -- com malloc -- foi efectuada durante a operação push).

 int main(int argc, char *argv[]) {
   char *ptr = NULL;
 
   printf("Sou %s, uma pilha de 'strings'. Capacidade: %d 'strings'.\n",
          argv[0], TAMANHO);
   processa_linha_de_comandos(argc, argv);
 
   while ((ptr = pop())) {
     printf("Li da pilha: %s\n", ptr);
     free(ptr);  /* liberta memória reservada com 'malloc' em 'push'!! */
   }
   printf("Hmm! Li tudo: a pilha ficou com %d elementos.\n", nframes());
 
   return 73;
 }

O programa pode ser compilado da seguinte forma (assume-se que sstack1.c contém a pilha e o programa acima).

 prompt% gcc -ansi -pedantic -Wall -o sstack1 sstack1.c

O resultado da execução do programa acima com TAMANHO (a dimensão máxima da pilha) igual a 1024 é o seguinte:

 prompt% ./sstack1 111 222 333 444 555 666 777
 Sou ./sstack1, uma pilha de 'strings'. Capacidade: 1024 'strings'.
 Há 7 argumentos na linha de comandos...
 Vou guardar o 1º argumento: 111...      consegui!!
 Vou guardar o 2º argumento: 222...      consegui!!
 Vou guardar o 3º argumento: 333...      consegui!!
 Vou guardar o 4º argumento: 444...      consegui!!
 Vou guardar o 5º argumento: 555...      consegui!!
 Vou guardar o 6º argumento: 666...      consegui!!
 Vou guardar o 7º argumento: 777...      consegui!!
 Uff! Guardei tudo: a pilha tem 7 elementos.
 Li da pilha: 777
 Li da pilha: 666
 Li da pilha: 555
 Li da pilha: 444
 Li da pilha: 333
 Li da pilha: 222
 Li da pilha: 111
 Hmm! Li tudo: a pilha ficou com 0 elementos.

Uma outra execução, mas com TAMANHO redefinido com o valor 5.

 prompt% ./sstack1 111 222 333 444 555 666 777
 Sou ./sstack1, uma pilha de 'strings'. Capacidade: 5 'strings'.
 Há 7 argumentos na linha de comandos...
 Vou guardar o 1º argumento: 111...      consegui!!
 Vou guardar o 2º argumento: 222...      consegui!!
 Vou guardar o 3º argumento: 333...      consegui!!
 Vou guardar o 4º argumento: 444...      consegui!!
 Vou guardar o 5º argumento: 555...      consegui!!
 Vou guardar o 6º argumento: 666...      falhei! Vou ignorar os restantes 2 argumentos.
 Não consegui guardar a partir do 6º argumento (666).
 Li da pilha: 555
 Li da pilha: 444
 Li da pilha: 333
 Li da pilha: 222
 Li da pilha: 111
 Hmm! Li tudo: a pilha ficou com 0 elementos.

O retorno da função main pode ser avaliado através da variável $status (do shell).

 prompt% echo $status
 73

Ver Também