Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con punteros en C

Estas en el tema de Problema con punteros en C en el foro de C/C++ en Foros del Web. Hola, tengo un problemilla con los punteros de C. Tengo el siguiente fragmento de código: #include <stdio.h> #include <iostream.h> typedef struct TipoNodo { char *pregunta; ...
  #1 (permalink)  
Antiguo 13/02/2006, 13:00
Avatar de Nietzsche  
Fecha de Ingreso: enero-2005
Ubicación: MALAGA-ESPAÑA
Mensajes: 228
Antigüedad: 19 años, 3 meses
Puntos: 0
Problema con punteros en C

Hola, tengo un problemilla con los punteros de C.
Tengo el siguiente fragmento de código:

#include <stdio.h>
#include <iostream.h>

typedef struct TipoNodo
{
char *pregunta;
char *respuesta;
struct TipoNodo *listaSi;
struct TipoNodo *listaNo;
}TNodo;


int main()
{
int tipo=0;
TNodo *animal;
TNodo *vegetal;
TNodo *mineral;

animal->pregunta="hola";


Y falla al asignarle un valor a "animal->pregunta". Según tengo en los apuntes de clase se hace asi... Alguien me echa una mano?. Gracias!
  #2 (permalink)  
Antiguo 13/02/2006, 14:00
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Ese código no tiene nada bien.

1. Estás tratando de meter una cadena en un puntero. C sólo permite "eso" cuando estás inicializando, porque sabe dónde y que tamaño tiene la cadena, en ningún lugar más. En la vida real no existe el tipo "String", es mera memoria consecutiva y por tanto debes usar las funciones strcpy(), strcat(), str...() que provee la librería de C en string.h

2. Más grave aún, estás declarando un puntero a un TNodo y después, sin reservar memoria, ni apuntar a ningún lugar, lo tratas de desreferenciar "animal->". Para que te hagas una idea, si lo hicieses en MS-DOS o Windows antiguo habrías colgado el sistema.

Última edición por MaxExtreme; 13/02/2006 a las 14:12
  #3 (permalink)  
Antiguo 13/02/2006, 21:52
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
MAxExtreme tiene toda la razon.
Primeramente crea espacio en la memoria para que tu puntero apunte ahi precisamente, despues usas strcpy.


#include <stdio.h>
#include <iostream.h>

typedef struct TipoNodo
{
char *pregunta;
char *respuesta;
struct TipoNodo *listaSi;
struct TipoNodo *listaNo;
}TNodo;


int main()
{
int tipo=0;
TNodo *animal;
TNodo *vegetal;
TNodo *mineral;

animal=(TNodo *)malloc(sizeof(TNodo));
strcpy(animal->pregunta, "hola");


Si, creo que eso esta bien. Ultimamente he estado cometiendo algunos errores, si es asi, que MaxExtreme me corrija.
Saludos
  #4 (permalink)  
Antiguo 14/02/2006, 00:35
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Ahí voy ;)

el strcpy() ciertamente es como de debe hacer, pero hay otro problema: No has reservado la memoria para el char*. Por lo tanto, o haces otro malloc por cada char* de un TNodo, o declaras los char como un array con espacio predefinido [100] por ejemplo.

Lo mejor sería crear una función constructora:

Código:
TNodo * NewNodo()
{
    TNodo * ret = malloc(sizeof(TNodo));
    ret->pregunta = malloc(sizeof(char)*MAX_BUFFER);
    ret->respuesta = malloc(sizeof(char)*MAX_BUFFER);
    return ret;
}

void DeleteNodo(TNodo * p)
{
    free(p->pregunta);
    free(p->respuesta);
    free(p);
}
Esa manera permitiría expandir las cadenas en caso de que se quedasen pequeñas, o cosas así. Pero en estos casos veo más limpio usar:

Código:
typedef struct TipoNodo
{
char Pregunta[100];
char Respuesta[100];
struct TipoNodo *listaSi;
struct TipoNodo *listaNo;
}TNodo;
Aunque evidentemente ya no vas a poder modificar ese espacio y podría quedarse corto fácilmente.
  #5 (permalink)  
Antiguo 14/02/2006, 04:59
Avatar de Nietzsche  
Fecha de Ingreso: enero-2005
Ubicación: MALAGA-ESPAÑA
Mensajes: 228
Antigüedad: 19 años, 3 meses
Puntos: 0
Efectivamente,
no habia reservado memoria
Perdon por mi ignorancia com los punteros.
Y muchas gracias a los dos, ya funciona correctamente.
  #6 (permalink)  
Antiguo 14/02/2006, 17:04
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Bueno, namas como extra.
Como dice MaxExtreme, tambien hay que reservar memoria para todos los char*.
Pero si quieres agrandarlas segun yo namas hay que usar una funcion para realocar la memoria...no recuerdo el nombre de la funcion.
SAludos
  #7 (permalink)  
Antiguo 14/02/2006, 17:09
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
realloc........................
  #8 (permalink)  
Antiguo 14/02/2006, 22:00
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Cita:
Iniciado por Nietzsche
Efectivamente,
no habia reservado memoria
Perdon por mi ignorancia com los punteros.
Y muchas gracias a los dos, ya funciona correctamente.
No te confundas, ignorante es el que no quiere aprender.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #9 (permalink)  
Antiguo 15/02/2006, 07:38
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por TolaWare
No te confundas, ignorante es el que no quiere aprender.
Eso es un gran offtopic (luego dices que desviamos las conversaciones...), pero la verdad:

ignorante.
(Del ant. part. act. de ignorar; lat. ignōrans, -antis).
1. adj. Que no tiene noticia de algo. U. t. c. s.
  #10 (permalink)  
Antiguo 15/02/2006, 10:35
 
Fecha de Ingreso: noviembre-2004
Ubicación: Lima-Peru
Mensajes: 81
Antigüedad: 19 años, 5 meses
Puntos: 0
discuplen la molstia pero no sé como enviar un mensaje por ejemplo a este grupo para hacer consultas ..... indicarme a quien va dirigido para q todos lo vean .......
gracias
__________________

Willians Kic2.
:aplauso:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:30.