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

From Wiki**3

Revision as of 14:08, 27 May 2005 by Root (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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