Gestão de Memória (pilha elástica)

From Wiki**3

Revision as of 10:38, 12 November 2008 by Root (talk | contribs) (Gestão de Memória (pilha elástica) moved to Gestão de Memória (pilha elástica))

Este exemplo faz uso de uma pilha de strings de dimensão variável para armazenar dados lidos da linha de comando.

Ficheiro main.c

 void processa_linha_de_comandos(int argc, char **argv, struct pilha *p) {
   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(p, 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", tamanho(p));
   else
     printf("Não consegui guardar a partir do %dº argumento (%s).\n", ax, argv[ax]);
 }

Note-se a libertação de memória (reserva efectuada em push).

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

Ver Também