Claro, gets(t), utiliza t como un buffer, como lo has definido como char* t = "dentro"; apunta a la cadena dentro, de 6 caracteres. Aquí vas a guardar las cadenas que introduzcas por el teclado. Si te pasas de caracteres... ERROR en tiempo de ejecución. Por otro lado, siempre apunta a la última cadena.
Prueba esto y te darás cuenta:
Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _nodo{
char *url;
int n;
struct _nodo *siguiente;
}TipoNodo;
typedef TipoNodo *pNodo;
typedef TipoNodo *Pila;
void Push(Pila *l,char *web);
char* Pop(Pila *l);
int main(){
Pila pila= NULL;
char t[256]; // buffer de 255 caracteres + /0
do{
printf("Introduzca la pagina web a visitar\n");
gets(t);
// t siempre apunta al buffer, por lo que siempre apilas un puntero que apunta al buffer que es la última cadena...
Push(&pila,t);
} while(strcmp(t,"salir")); // "salir" también ha sido apilada, por lo que es la última cadena y la UNICA que printf puede ver...
while(pila->siguiente!=NULL){
Pop(&pila);
printf("%d %s\n",pila->n, pila->url);
}
printf("Final presione una tecla para continuar...");
getch();
return 0;
}
void Push(Pila *pila,char *web){
pNodo nuevo;
nuevo= (pNodo)malloc(sizeof(TipoNodo));
if(*pila==0) nuevo->n=0;
else nuevo->n=(*pila)->n+1;
nuevo->url= web;
nuevo->siguiente= *pila;
*pila=nuevo;
}
char* Pop(Pila *pila){
pNodo nodo;
char *val;
nodo=*pila;
if(!nodo) return "Vacio";
*pila= nodo->siguiente;
val=nodo->url;
free(nodo);
return val;
}
Saludos.