2011-10-14 2 views
2

임이 오류가 발생했습니다.세그먼트 오류 - Kern_Invalid_Address 메모리에 액세스 할 수 없습니다.

프로그램 수신 신호 EXC_BAD_ACCESS, 메모리에 액세스 할 수 없습니다. 이유 : KERN_INVALID_ADDRESS 주소 : strlen 함수에서 0x0000000000000000 0x00007fff86703c00()

나는 GDB 나타나는 그 첫 번째 것은이를 달렸다. 분할 오류

임 긍정적 인 오류 영역에있다 "Funcion Busqueda"임 붙여 전체 : 심지어 터미널에

나는이 오류가 ... 나는이 오류를 찾을 수있는 선 말해 나던 너가 다른 것을 발견하면 너는 나에게 말할 수있다.

이 세그멘테이션 오류의 원인을 찾아야합니다! 그것은 무엇 beeeee 수 있 었는가?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include "clientes.h" 


int ordena(LISTA1 *inicio,LISTA1 *aux,LISTA1 *nodo,LISTA1 *aux2); 
int agrega_cliente(LISTA1 *inicio, LISTA1*aux,LISTA1 *nodo,LISTA1 *aux2); 
int busca_cliente(LISTA1 *inicio, LISTA1*aux,LISTA1 *nodo,LISTA1 *aux2,LISTA2 *inicioventas,LISTA2 *auxventas,LISTA2 *nodoventas,LISTA2 *aux2ventas); 
int main(void) 
{ 
    int menu,pops=0; 
LISTA1 *inicio, *aux,*nodo, *aux2; 
inicio=NULL; 
aux=inicio; 
LISTA2 *inicioventas, *auxventas,*nodoventas, *aux2ventas; 
inicioventas=NULL; 
auxventas=inicioventas; 
system("clear"); 
    //funcion void carga_datos(); 
ordena(inicio,aux,nodo,aux2); 

    printf("TIENDA DEPARTAMENTAL\n\n\n"); 
    printf("1. Agregar a un Cliente.\n2. Agregar una venta.\n3. Buscar Cliente. \n4. Borrar Cliente. \n5. Borrar una venta. \n6. Salir."); 
    printf("\n\nElige una opcion: "); 
    scanf("%d", &menu); 
    switch(menu) 
    { 
    case 1: 
    system("clear"); 
    printf("opcion1\n"); 
     agrega_cliente(inicio,aux,nodo,aux2); 

    break; 
    case 2: 
    system("clear"); 
    printf("opcion2\n"); 
    break; 
    case 3: 
    system("clear"); 
    printf("opcion3\n"); 

     busca_cliente(inicio,aux,nodo,aux2,inicioventas, auxventas, nodoventas, aux2ventas); 
     puts(aux2->nombre); 

    break; 
    case 4: 
    system("clear"); 
    printf("opcion4\n"); 
    break; 
    case 5: 
    system("clear"); 
    printf("opcion5\n"); 
    break; 
    case 6: 
    system("clear"); 
    printf("opcion6\n"); 
    break; 
    } 
} 

////////////////////////////////////////FUNCION BUSQUEDA////////////////////////// 
int busca_cliente(LISTA1 *inicio, LISTA1 *aux,LISTA1 *nodo,LISTA1 *aux2,LISTA2  *inicioventas,LISTA2 *auxventas,LISTA2 *nodoventas,LISTA2 *aux2ventas) 
{ 
char nombrebusqueda[80]; 
int numclienteprueba; 
printf("Dame el nombre del cliente a buscar\n"); 
scanf("%s",nombrebusqueda); 
aux2=aux; 
while(aux2!=NULL) 
{ 
    if((strcmp(nombrebusqueda,aux2->nombre))==0) 
    { 
     puts(aux2->nombre); 
     ////////Buscamos la venta 
     aux2ventas=auxventas; 
     while(aux2ventas!=NULL) 
     { 
      numclienteprueba=aux2ventas->num_clienteventas; 
      if(numclienteprueba==aux2ventas->num_clienteventas) 
      { 
       printf("Wow"); 
      } 
      aux2ventas=aux2ventas->sigvent; 
     } 
     //////////// 
    } 
    aux2=aux2->sig; 
    } 
} 

    ////////////////////////////////////////////Funcion Ordena 



int ordena(LISTA1 *inicio, LISTA1*aux,LISTA1 *nodo,LISTA1 *aux2) 
{ 
char pruebaman[80],probaman[80];//nombres 
char pruebadireccion[150],probadireccion[150];//direccion 
int pruebanum_cliente,probanum_cliente;//numero de cliente 
aux2=aux; 
strcpy(pruebaman,aux2->nombre); 
strcpy(pruebadireccion,aux2->direccion); 
pruebanum_cliente=aux2->num_cliente; 
aux2=aux2->ant; 

do 
{ 

    strcpy(probaman,aux2->nombre); 

    if(pruebaman[0]<probaman[0]) 
    { 
     strcpy(pruebaman,aux2->nombre); 
     strcpy(pruebadireccion,aux2->direccion); 
     pruebanum_cliente=aux2->num_cliente; 
     aux2=aux2->sig; 
     strcpy(aux2->nombre,probaman); 
     strcpy(aux2->direccion,probadireccion); 
     probanum_cliente=aux2->num_cliente;  
    } 
    strcpy(pruebaman,aux2->nombre); 
    strcpy(pruebadireccion,aux2->direccion); 
    pruebanum_cliente=aux2->num_cliente; 

    aux2=aux2->ant; 


    printf("Ciclo\n\n"); 

    } 
    while(aux2!=NULL); 
aux2=aux; 
strcpy(pruebaman,aux2->nombre); 
aux2=aux2->ant; 
strcpy(probaman,aux2->nombre); 
if(pruebaman[0]<probaman[0]) 
    ordena(inicio,aux,nodo,aux2); 
} 


/////////////////// 

    ///////////////////////////////////////////////////////Agrega Cliente 
    int agrega_cliente(LISTA1 *inicio, LISTA1*aux,LISTA1 *nodo,LISTA1 *aux2) 
{ 

FILE *clientes; 
clientes=fopen("clientes.txt", "a+"); 
//fseek(clientes, 0L, SEEK_END); 

inicio=NULL; 
nodo=malloc(sizeof(LISTA1)); 
aux=malloc(sizeof(LISTA1)); 

if(nodo==NULL) 
{ 
    printf("No hay memoria\n"); 
    exit(1); 
} 
printf("NOMBRE: "); 
gets(nodo->nombre); 
printf("DIRECCION: "); 
gets(nodo->direccion); 
printf("NUMERO DE CLIENTE: "); 
scanf("%d", &nodo->num_cliente); 

if(inicio==NULL) 
{ 
    inicio=nodo; 
    inicio->sig=NULL; 
    inicio->ant=NULL; 
    aux=inicio; 
} 
else 
{ 
    aux->sig =nodo; 
    nodo->ant=aux; 
    aux=nodo; 
    nodo->sig=NULL; 
} 
nodo=malloc(sizeof(LISTA1)); 

aux2=inicio; 

while(aux2!=NULL) 
    { 
    fprintf(clientes, "%s\n", aux2->nombre); 
    fprintf(clientes, "%s\n", aux2->direccion); 
    fprintf(clientes, "%d\n", aux2->num_cliente); 
    puts(aux2->nombre); 
    puts(aux2->direccion); 
    aux2=aux2->sig; 
    } 


aux2=aux; 
do 
    { 
    puts(aux2->nombre); 
    aux2=aux2->ant; 
    } 
    while(aux2!=NULL); 
fclose(clientes); 
} 

///////////////////////////////////////////////////// 
+4

문제의 범위를 좁히고 고함을 지르지 마십시오. –

+0

하하하 임금이 소리를 지르지 않고 그냥 좌절했다. 문제는이 영역으로 좁혀진다. "Funcion Busqueda"는 내가 방금 목록과 포인터와 관련이있는 Im positive를 추가 한 기능이다. – drodri420

+0

왜 디버거에서 실행하지 않습니까? 그런 다음 잘못된 메모리 액세스 권한이있는 행에서 중단됩니다. –

답변

1

NULL 포인터처럼 보입니다. 메모리 위치 0x0000에 액세스하려고하면 포인터가 0x0000 (NULL)을 가리키고 있음을 의미합니다.

+0

Inicio와 inicioventas만이 NULL이되어야합니다. 이것이 문제가 될 수 있습니까? – drodri420

+0

메모리 위치 0x0000에 쓸 때 운영 체제가 그것을 좋아하지 않습니다. 덮어 쓰지 않으려는 물건이 있습니다. –

관련 문제