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

Problema con punteros, error: 0xC0000005

Estas en el tema de Problema con punteros, error: 0xC0000005 en el foro de C/C++ en Foros del Web. Hola, estoy desarrollando una aplicación en C++ y cuando ya casi la tengo terminada me han surgido unos problemas con algunos punteros que no consigo ...
  #1 (permalink)  
Antiguo 06/02/2009, 07:29
 
Fecha de Ingreso: mayo-2008
Ubicación: Murcia, España
Mensajes: 313
Antigüedad: 16 años
Puntos: 5
Problema con punteros, error: 0xC0000005

Hola, estoy desarrollando una aplicación en C++ y cuando ya casi la tengo terminada me han surgido unos problemas con algunos punteros que no consigo resolver.

El depurador, me lanza una excepción con el siguiente mensaje:

Cita:
Excepción no controlada en 0x000a8696 en Banco.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x000000c4.
El problema aparece cuando desde algún método de una clase quiero retornar un puntero. Una de las líneas que me genera este error es:

Código:
class Cliente {
private:
ListaCuenta* accounts;
ListaCuenta* getAccounts() { return this->accounts; } <--Esta función es la que genera la excepción
...
public:
Cliente() {
	...
	this->accounts = new ListaCuenta();
	...
}
...
Como podeis ver.. inicializo el puntero correctamente en el constructor de la clase.
Esto antes no ocurría, conforme ha ido creciendo la aplicación ha surgido.
También me ocurre en otras partes del código. En cambio, si separo esta clase de toda la aplicación, puedo utilizarla tranquilamente que no da ningún problema, al igual que el resto de errores del mismo tipo. Uno de ellos es una Pila, la cual he utilizado en muchos programas sin problemas, en cambio, aquí peta.

Gracias de antemano
  #2 (permalink)  
Antiguo 09/02/2009, 05:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problema con punteros, error: 0xC0000005

this (el Cliente) es 0, por eso accede a 0x000000c4 this + offset de accounts. Depuralo y fijate la razon por la cual this es 0.

PD. ¿Alguna razon para hacer this->accounts = new ListaCuenta(); en lugar de this->accounts = new ListaCuenta;?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 09/02/2009, 07:41
 
Fecha de Ingreso: mayo-2008
Ubicación: Murcia, España
Mensajes: 313
Antigüedad: 16 años
Puntos: 5
Respuesta: Problema con punteros, error: 0xC0000005

Me han enseñado que para llamar al constructor de la clase debo usar los () y nunca me he planteado no hacerlo.

Ya solucioné el problema. Tenía una linea por ahi con un sprintf que intentaba pasar un string a double y al parecer, esa conversión no es muy estable y daba problemas de memoria y tal. Lo solucioné. Gracias por la ayuda.
  #4 (permalink)  
Antiguo 09/02/2009, 07:44
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problema con punteros, error: 0xC0000005

Cita:
Iniciado por eSSeneX Ver Mensaje
Me han enseñado que para llamar al constructor de la clase debo usar los () y nunca me he planteado no hacerlo.
No es necesario.

Cita:
Iniciado por eSSeneX Ver Mensaje
Ya solucioné el problema. Tenía una linea por ahi con un sprintf que intentaba pasar un string a double y al parecer, esa conversión no es muy estable y daba problemas de memoria y tal. Lo solucioné. Gracias por la ayuda.
Algun problema con la pila tal vez; de nadas.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 09/02/2009, 07:59
 
Fecha de Ingreso: mayo-2008
Ubicación: Murcia, España
Mensajes: 313
Antigüedad: 16 años
Puntos: 5
Respuesta: Problema con punteros, error: 0xC0000005

Ya puestos, que diferencia hay?
  #6 (permalink)  
Antiguo 09/02/2009, 08:15
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problema con punteros, error: 0xC0000005

Ninguna; pero si no hay parametros para el constructor pierden sentido los parentesis y normalmente no se usa con tipos primitivos tampoco.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 17/06/2010, 03:46
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

Hola:

Me ocurre un error similar en el siguiente código:

void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion)
{
int indice;

if (*n_vuelos > 1)
{
for(indice = *n_vuelos - 1; indice >= *posicion; indice--)
{
strcpy((*(p_vuelo + indice)).destino, (*(p_vuelo + indice - 1)).destino);
strcpy((*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice - 1)).horario_salida);
(*(p_vuelo+indice)). numero_plazas_libres = (*(p_vuelo + indice - 1)).numero_plazas_libres;
(*(p_vuelo+indice)).numero_vuelo = indice+1;
}
}
strcpy((*(p_vuelo + *posicion - 1)).destino, nuevo_vuelo.destino);
strcpy((*(p_vuelo + *posicion - 1)).horario_salida, nuevo_vuelo.horario_salida);
(*(p_vuelo + *posicion - 1)).numero_plazas_libres = nuevo_vuelo.numero_plazas_libres;
(*(p_vuelo + *posicion - 1)).numero_vuelo = *posicion;
}

concretamente en el primer strcpy.

¿Podeis ver alguien lo que tengo mal?

Gracias y Saludos a todos.
  #8 (permalink)  
Antiguo 17/06/2010, 08:35
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Problema con punteros, error: 0xC0000005

gonzab, en primera, podrias poner como es la estructura de datos vuelos. para empezar su miembro destino es un puntero a cadena, o es un arreglo?. posicion puede valer 0, si es asi, cuando indice valga 0, al restarle 1 entoces estaras accesando a una direccion de memoria no asignada. Podrias mandar los valores para n_vuelos y posición.
  #9 (permalink)  
Antiguo 18/06/2010, 04:47
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

Gracias por responder margarito04.

La estructura de datos de vuelos es:
struct vuelos
{
int numero_vuelo;
char destino[30];
char horario_salida[5];
int numero_plazas_libres;
};


n_vuelos vale 2 y posición vale 0, por lo que el indice en el for va de 1 a 0, pero cuando toma el valor 1 ya da el error, antes de llegar a tomar el valor 0.

Se trata de insertar un vuelo en la estructura y luego pasarlo a fichero, de la siguiente forma:

//AÑADIR

void añadir_nuevo_vuelo (void)
{
int n_vuelos, posicion;
struct vuelos *p_vuelo;
struct vuelos nuevo_vuelo;

n_vuelos = num_vuelos();
n_vuelos++;
p_vuelo = reserva_memoria (&n_vuelos);
n_vuelos--;
vuelca_fichero_a_array (p_vuelo, &n_vuelos);
nuevo_vuelo = pide_informacion();
posicion = busca_posicion (p_vuelo, nuevo_vuelo, &n_vuelos);
n_vuelos++;
insertar (p_vuelo, nuevo_vuelo, &n_vuelos, &posicion);
vuelca_array_a_fichero (p_vuelo, &n_vuelos);
libera_memoria (p_vuelo);
}

/**********Pide informacion del elemento a añadir************************/

struct vuelos pide_informacion(void)
{
struct vuelos nuevo_vuelo;

printf("\tDestino ---> ");
gets(nuevo_vuelo.destino);
printf("\tHorario de salida ---> ");
gets(nuevo_vuelo.horario_salida);
printf("\tNumero de plazas libres ---> ");
scanf("%d", &nuevo_vuelo.numero_plazas_libres);
fflush(stdin);

return (nuevo_vuelo);
}

/*************Ver la posicion del elemento a añadir***********************/

int busca_posicion (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos)
{
int indice = 0, comprobacion;
int inicio = 0, final, mitad, posicion;
final = *n_vuelos-1;
mitad = (inicio+final) / 2;

do
{
comprobacion=strcmp((*(p_vuelo+mitad)).horario_sal ida, nuevo_vuelo.horario_salida);
if(comprobacion < 0)
inicio = mitad + 1;
if(comprobacion > 0)
final = mitad - 1;

mitad = (inicio + final) / 2;
}
while (inicio < final && comprobacion != 0);

if (comprobacion <= 0)
posicion = mitad + 1;
else
posicion = mitad;

return(posicion);
}

/**********************Insertar el nuevo elemento en su sitio***************/

void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion)
{
int indice;

if (*n_vuelos > 1)
{
for(indice = *n_vuelos - 1; indice >= *posicion; indice--)
{
strcpy((*(p_vuelo + indice)).destino, (*(p_vuelo + indice - 1)).destino);
strcpy((*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice - 1)).horario_salida);
(*(p_vuelo+indice)). numero_plazas_libres = (*(p_vuelo + indice - 1)).numero_plazas_libres;
(*(p_vuelo+indice)).numero_vuelo = indice+1;
}
}
strcpy((*(p_vuelo + *posicion - 1)).destino, nuevo_vuelo.destino);
strcpy((*(p_vuelo + *posicion - 1)).horario_salida, nuevo_vuelo.horario_salida);
(*(p_vuelo + *posicion - 1)).numero_plazas_libres = nuevo_vuelo.numero_plazas_libres;
(*(p_vuelo + *posicion - 1)).numero_vuelo = *posicion;
}

/*****************Vuelca el array al fichero*********************/

void vuelca_array_a_fichero (struct vuelos *p_vuelo, int* n_vuelos)
{
FILE* punt_fich;
int indice;

if ((punt_fich = fopen("Vuelos.ima", "wb")) != (FILE*)NULL)
{
fwrite(n_vuelos, sizeof(int) , 1, punt_fich);
for(indice = 0; indice < *n_vuelos; indice++)
{
fwrite((p_vuelo + indice), sizeof(struct vuelos), 1, punt_fich);
}
fclose (punt_fich);
}
}

Me da el problema en la primera inserción. No sé si en las siguientes podría ir bien.

Muchas gracias y Saludos.
  #10 (permalink)  
Antiguo 18/06/2010, 11:04
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problema con punteros, error: 0xC0000005

Lo mejor que podes hacer es, depurar tu programa asi ves que valores tienen exactamente los punteros involucrados en el error, ademas de crear un hilo nuevo, este error es muy generico, estas accediendo a memoria invalida.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 18/06/2010, 12:49
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Problema con punteros, error: 0xC0000005

para poderte ayudar pon las funciones que utlizas añadir_nuevo_vuelo. para ver como las tienes implementadas
  #12 (permalink)  
Antiguo 21/06/2010, 03:53
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

Margarito04, Gracias por tu ayuda.

Las funciones implicadas te las puse el otro día. Si necesitas algo más, dime.

Gracias y un saludo
  #13 (permalink)  
Antiguo 21/06/2010, 09:13
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Problema con punteros, error: 0xC0000005

Ok pero me refiero a las funciones k utilizas en la funcion añadir_nuevo vuelo. ya estas tambien son importantes de analizar
num_vuelos();
reserva_memoria ();
reserva_memoria ();
pide_informacion();
libera_memoria ();
  #14 (permalink)  
Antiguo 23/06/2010, 05:28
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

Margarito04, te pongo todo lo que tengo hecho del programa para AÑADIR:

/**** definición de estructura *****/

struct vuelos
{
int numero_vuelo;
char destino[30];
char horario_salida[5];
int numero_plazas_libres;
};

/******** definicion de funciones ************/

int menu (void);

//VISUALIZAR

void informacion_de_vuelos (void);
int num_vuelos (void);
struct vuelos *reserva_memoria (int *n_vuelos);
void vuelca_fichero_a_array (struct vuelos *p_vuelo, int *n_vuelos);
void visualizar (int *n_vuelos, struct vuelos *p_vuelo);
void libera_memoria (struct vuelos *p_vuelo);

//AÑADIR

void añadir_nuevo_vuelo (void);
struct vuelos pide_informacion (void);
int busca_posicion (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos);
void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion);
void vuelca_array_a_fichero (struct vuelos *p_vuelo, int *n_vuelos);

//ELIMINAR

void cancelar_vuelo (void);
int pide_n_vuelo (void);
void eliminar (struct vuelos *p_vuelo, int *n_vuelos, int *n_vuelo);

//MODIFICAR

void modificar_horario (void);
void pide_informacion_mod (int *vuelo, char *nuevo_horario);
void actualiza_informacion (struct vuelos *p_vuelo, int *n_vuelos, int *vuelo, char *nuevo_horario);

//ACTUALIZAR

void mod_plazas_libres (void);
void pide_info (int *vuelo, int *numero_plazas_ocupar);
void actualiza_info (struct vuelos *p_vuelo, int *vuelo, int *numero_plazas_ocupar);


/************ main *************/


void main (void)
{
int opcion;

printf("CONTROL DE VUELOS\n");

do
{
opcion=menu();
switch (opcion)
{
case 0:
{
printf("\n\nSALIR DEL PROGRAMA. Pulse cualquier tecla...");
getch();
break;
}
case 1:
{
printf("\n\nINFORMACION DE VUELOS\n\n");
informacion_de_vuelos ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 2:
{
printf("\n\nAÑADIR NUEVO VUELO\n\n");
añadir_nuevo_vuelo ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 3:
{
printf("\n\nCANCELAR UN VUELO\n\n");
cancelar_vuelo ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 4:
{
printf("\n\nMODIFICAR HORARIO DE SALIDA DE UN VUELO\n\n");
modificar_horario ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
case 5:
{
printf("\n\nACTUALIZAR EL NUMERO DE PLAZAS LIBRES DE UN VUELO\n\n");
mod_plazas_libres ();
printf("\n\nPulse cualquier tecla para volver al menu...");
getch();
break;
}
default:
{
printf("\n\nOPCION NO VALIDA. Pulse cualquier tecla para volver al menu...");
getch();
break;
}
}
}
while (opcion != 0);
}

/************************************************/
//Menu de opciones

int menu (void)
{
int opcion;

printf("\n\nMenu de opciones:\n\t0.- Salir del progarma\n\t1.- Informacion de vuelos\n\t2.- Añadir un nuevo vuelo\n\t3.- Cancelar un vuelo\n\t4.- Modificar horario de salida de un vuelo\n\t5.- Actualizar el numero de plazas libres de un vuelo\n");
scanf("%d", &opcion);
fflush(stdin); /*****limpia buffer de entrada*******/

return (opcion);
}

/
/**********ver cuantos registros tiene el fichero**********************************/

int num_vuelos (void)
{
FILE *punt_fich;
int n_vuelos = 0;

if ((punt_fich = fopen("Vuelos.ima", "rb")) != (FILE *)NULL)
{
fread(&n_vuelos, sizeof(int), 1, punt_fich);
fclose(punt_fich);
}

return(n_vuelos);
}

/***Reservamos memoria para el array y la identificamos con un puntero******/

struct vuelos *reserva_memoria (int *n_vuelos)
{

struct vuelos *p_vuelo;

p_vuelo = (struct vuelos *)malloc(*n_vuelos * sizeof(struct vuelos));

return (p_vuelo);
}

/***********Volcamos el fichero al array**************/

void vuelca_fichero_a_array (struct vuelos *p_vuelo, int *n_vuelos)
{
FILE *punt_fich;
int indice = 0;

if ((punt_fich = fopen("Vuelos.ima", "rb")) != (FILE *)NULL)
{
fseek(punt_fich, sizeof(int), SEEK_SET);
while (indice < *n_vuelos)
{
fread((p_vuelo + indice), sizeof(struct vuelos), 1, punt_fich);
indice++;
}
fclose(punt_fich);
}
}

/*******Visualizamos el array completo de la estructura*************/

void visualizar (int *n_vuelos, struct vuelos *p_vuelo)
{
int indice;

printf("%18s %18s %18s %18s", "N. VUELO", "DESTINO", "HORA DE SALIDA", "N.PLAZAS LIBRES");
for (indice = 0; indice< *n_vuelos; indice++)
{
printf("\n%18d %18s %18s %18d", (*(p_vuelo + indice)).numero_vuelo, (*(p_vuelo + indice)).destino, (*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice)).numero_plazas_libres);
}
}

/***************liberar memoria***************/

void libera_memoria (struct vuelos *p_vuelo)
{
free(p_vuelo);
}

//AÑADIR

void añadir_nuevo_vuelo (void)
{
int n_vuelos, posicion;
struct vuelos *p_vuelo;
struct vuelos nuevo_vuelo;

n_vuelos = num_vuelos();
n_vuelos++;
p_vuelo = reserva_memoria (&n_vuelos);
n_vuelos--;
vuelca_fichero_a_array (p_vuelo, &n_vuelos);
nuevo_vuelo = pide_informacion();
posicion = busca_posicion (p_vuelo, nuevo_vuelo, &n_vuelos);
n_vuelos++;
insertar (p_vuelo, nuevo_vuelo, &n_vuelos, &posicion);
vuelca_array_a_fichero (p_vuelo, &n_vuelos);
libera_memoria (p_vuelo);
}

/**********Pide informacion del elemento a añadir************************/

struct vuelos pide_informacion(void)
{
struct vuelos nuevo_vuelo;

printf("\tDestino ---> ");
gets(nuevo_vuelo.destino);
printf("\tHorario de salida ---> ");
gets(nuevo_vuelo.horario_salida);
printf("\tNumero de plazas libres ---> ");
scanf("%d", &nuevo_vuelo.numero_plazas_libres);
fflush(stdin);

return (nuevo_vuelo);
}

/*************Ver la posicion del elemento a añadir***********************/

int busca_posicion (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos)
{
int indice = 0, comprobacion;
int inicio = 0, final, mitad, posicion;
final = *n_vuelos-1;
mitad = (inicio+final) / 2;

do
{
comprobacion=strcmp((*(p_vuelo+mitad)).horario_sal ida, nuevo_vuelo.horario_salida);
if(comprobacion < 0)
inicio = mitad + 1;
if(comprobacion > 0)
final = mitad - 1;

mitad = (inicio + final) / 2;
}
while (inicio < final && comprobacion != 0);

if (comprobacion <= 0)
posicion = mitad + 1;
else
posicion = mitad;

return(posicion);
}

/**********************Insertar el nuevo elemento en su sitio***************/

void insertar (struct vuelos *p_vuelo, struct vuelos nuevo_vuelo, int *n_vuelos, int *posicion)
{
int indice;

if (*n_vuelos > 1)
{
for(indice = *n_vuelos - 1; indice >= *posicion; indice--)
{
strcpy((*(p_vuelo + indice)).destino, (*(p_vuelo + indice - 1)).destino);
strcpy((*(p_vuelo + indice)).horario_salida, (*(p_vuelo + indice - 1)).horario_salida);
(*(p_vuelo+indice)). numero_plazas_libres = (*(p_vuelo + indice - 1)).numero_plazas_libres;
(*(p_vuelo+indice)).numero_vuelo = indice+1;
}
}
strcpy((*(p_vuelo + *posicion - 1)).destino, nuevo_vuelo.destino);
strcpy((*(p_vuelo + *posicion - 1)).horario_salida, nuevo_vuelo.horario_salida);
(*(p_vuelo + *posicion - 1)).numero_plazas_libres = nuevo_vuelo.numero_plazas_libres;
(*(p_vuelo + *posicion - 1)).numero_vuelo = *posicion;
}

/*****************Vuelca el array al fichero*********************/

void vuelca_array_a_fichero (struct vuelos *p_vuelo, int* n_vuelos)
{
FILE* punt_fich;
int indice;

if ((punt_fich = fopen("Vuelos.ima", "wb")) != (FILE*)NULL)
{
fwrite(n_vuelos, sizeof(int) , 1, punt_fich);
for(indice = 0; indice < *n_vuelos; indice++)
{
fwrite((p_vuelo + indice), sizeof(struct vuelos), 1, punt_fich);
}
fclose (punt_fich);
}
}




Gracias y un saludo.
  #15 (permalink)  
Antiguo 29/06/2010, 03:41
 
Fecha de Ingreso: junio-2010
Mensajes: 5
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problema con punteros, error: 0xC0000005

¿A alguien se le ocurre algo?

Gracias a todos y un saludo.
  #16 (permalink)  
Antiguo 29/06/2010, 19:43
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema con punteros, error: 0xC0000005

Cita:
Iniciado por GONZAB Ver Mensaje
¿A alguien se le ocurre algo?
Sugerencias:

- Recorta tu programa hasta dejar lo mínimo necesario para entenderlo y hacer una pregunta puntual. El ultimo post tuyo es un kilometro de codigo y ninguna pregunta.
- Usa highlight para que el codigo se vea asi
Código C++:
Ver original
  1. if( a >  b )
  2. {
  3.        printf( "Hola" );
  4. }

Asi alguien puede decir: hay un error en la linea 3 (por ejemplo). O tu mismo lo puedes usar para decir, me aparece el error "XXXXX" en la linea 99.
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 16:16.