Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/06/2013, 14:15
Avatar de patilanz
patilanz
 
Fecha de Ingreso: enero-2012
Mensajes: 880
Antigüedad: 12 años, 4 meses
Puntos: 29
Respuesta: Infraccion en acceso

Cita:
Iniciado por vosk Ver Mensaje
"...El codigo lo copie de un libro de c/c++ ...."

Me da la impresion que el original no debia ser asi, no se es lo que me parece. Voy a seguir el flujo de datos de tu codigo para ver lo que hace:

Código:
struct _nodo *principio;
principio = new struct _nodo;//bloqueas mem para un nodo
    
add(principio);//envias el nodo a la funcion
Cuando bloqueas memoria (dinamica o estatica dentro de funciones) se asigna un bloque de memoria que no necesariamente es nulo, es decir que puede contener datos basura de otros usos de ese bloque de memoria. Si bloqueas memoria y no la inicializas entonces no puedes usar los comparadores contra nulo porque pueden no funcionar (lo normal es que no funcionen). Sigo con el flujo sin corregir lo de inicializar:

Código:
//dentro de 'add'
...
if(p != NULL) {
        aux = p;
        while(aux->siguiente != NULL) { //violacion de acceso en el 2º ciclo
            aux = aux->siguiente;
        }
....
El 'p' es el nodo que creaste en el main pero no inicializaste sus campos, es decir que contienen datos basura (con mucha suerte seran nulos, pero no es lo normal); la comprovacion aux->siguiente != NULL se cumple cuando los datos basura del 'p' no inicializado no son nulos (es decir casi siempre por no decir siempre); en el primer ciclo se cumple porque no inicializaste a nulo el 'p->siguiente', luego asignas 'aux->siguiente' a 'aux' y entras en el segundo ciclo suponiendo que 'aux' esta apuntando a una direccion de memoria accesible por la aplicacion cuando en verdad esta apuntando a una direccion de memoria basura no accesible (o de momento no accesible), por eso cuando intentas buscar el campo 'siguiente' de un bloque de memoria no accesible se produce la violacion de acceso.

Por que crees que en la funcion 'add' estas asignando nulo a nuevo_nodo->siguiente? Por eso mismo, para no dejar datos no inicializados.

Otra cosa, fflush() no sirve para stdin (echa un vistazo a cualquier manual de la funcion fflush). Y la funcion main es de tipo entero por lo que debe retornar un entero.

Saludos
vosk

Muchas gracias, lo que me explicaste no tenia ni idea de esto. Ahora ya lo corregi asignando a principio->siguiente=NULL

La funciona main es de tipo entero pero igual funciona sin que retorne nada. Para que es necesario que retorne algo?

Lo de fflush() vi un tutorial. No sabia que se usa para vaciar el buffer de los ficheros. Yo lo utilizo para vaciar el buffer del teclado. Esto se explica en el libro, y el stdin no se para que se pone.

Saludos