Difference between revisions of "Gestão de Memória (pilha elástica)"

From Wiki**3

 
Line 6: Line 6:
 
     unsigned ax;
 
     unsigned ax;
 
     unsigned char falhei = 0;
 
     unsigned char falhei = 0;
     printf("%d argumentos na linha de comandos...\n", argc-1);
+
     printf("Há %d argumentos na linha de comandos...\n", argc-1);
 
    
 
    
 
     for (ax = 1; ax < argc; ax++) {
 
     for (ax = 1; ax < argc; ax++) {
 
       char *arg = argv[ax];
 
       char *arg = argv[ax];
       printf("Vou guardar o %dº argumento: %s... \t", ax, arg);
+
       printf("Vou guardar o %dº argumento: %s... \t", ax, arg);
 
    
 
    
 
       if (push(p, arg) != FALHA) printf("consegui!!\n");
 
       if (push(p, arg) != FALHA) printf("consegui!!\n");
Line 23: Line 23:
 
       printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", tamanho(p));
 
       printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", tamanho(p));
 
     else
 
     else
       printf("Não consegui guardar a partir do %dº argumento (%s).\n", ax, argv[ax]);
+
       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 <code>[[Pilha (dimensão variável)|push]]</code>).
+
Note-se a libertação de memória (reserva efectuada em <code>[[Pilha (dimensão variável)|push]]</code>).
  
 
   int main(int argc, char *argv[]) {
 
   int main(int argc, char *argv[]) {
Line 39: Line 39:
 
     while ((ptr = pop(&p))) {
 
     while ((ptr = pop(&p))) {
 
       printf("Li da pilha: %s\n", ptr);
 
       printf("Li da pilha: %s\n", ptr);
       '''free'''(ptr);            /* libertar memória (malloc em push) */
+
       '''free'''(ptr);            /* libertar memória (malloc em push) */
 
     }
 
     }
 
    
 
    
Line 46: Line 46:
 
   }
 
   }
  
== Ver Também ==
+
== Ver Também ==
  
* [[Gestão de Memória (exemplo com pilha)]]
+
* [[Gestão de Memória (exemplo com pilha)]]

Latest revision as of 12:54, 24 March 2009

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