c - 段错误 - 无法访问内存,Kern_Invalid_Address

标签 c memory-management segmentation-fault memory-address

我收到这个错误,这可能是什么???

程序收到信号 EXC_BAD_ACCESS,无法访问内存。 原因:KERN_INVALID_ADDRESS 地址:0x0000000000000000 strlen () 中的 0x00007fff86703c00

我在 GDB 中运行了它,它首先出现。它甚至没有告诉我在哪条线上可以找到这个错误...

在终端上我得到这个错误:Segmentation Fault

我肯定错误出在区域“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);
} 

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

最佳答案

它看起来像一个 NULL 指针。当您尝试访问内存位置 0x0000 时,这意味着指针指向 0x0000(NULL)。

关于c - 段错误 - 无法访问内存,Kern_Invalid_Address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7768146/

相关文章:

c++ - C++中的内存分配分析

C++创建导致段错误的新数组

c - 按钮长按后停止计数

c - ALSA Lib 1.1.2 编译错误

c - 切换到更高分辨率

c - MpLab C、汇编、中断定义冲突

linux - 使用 'push' 或 'sub' x86 指令时如何分配堆栈内存?

android - 通过 Intent 传递可分割对象的实例是否会泄漏内存?

c - 在循环中使用 getline() 时出现段错误

c - 在c中合并两个单链接列表