2013-11-02 105 views
0

我的代码有问题。当我运行它时,它崩溃了...当我调试它时说这是一个“Segmentation fault”错误。但是我找不到这个bug。 Here's的代码:无法找到我的代码中的错误....分段错误

listaArchivo.H(标题)

#ifndef LISTAARCHIVOS_H 
    #define LISTAARCHIVOS_H 

    #include "Archivo.h" 

    struct _listaArchivos{ 
     Archivo arch; 
    }; 
    typedef _listaArchivos* ListaArchivos; 

/* 
* creates and initializes a new lista of archivos. 
*/ 
    ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista; 

     (*lista)->arch=NULL; 

     return *lista; 
    } 

/* 
* inserts 'archivo' in 'lista'. 
*/ 
    void insertarArchivoListaArchivos(ListaArchivos &lista, Archivo archivo){ 
     Archivo *nuevoArchivo; 
     nuevoArchivo=new Archivo; 
     *nuevoArchivo=archivo; 
     if (lista==NULL){ 
      lista->arch=*nuevoArchivo; 
      lista->arch->Anterior=NULL; 
      lista->arch->Siguiente=NULL; 
     } 
    } 

“Archivo.h”(标题)

#ifndef ARCHIVO_H 
    #define ARCHIVO_H 
    struct _archivo{ 
     Cadena nombreArchivo; 
     Cadena Atributos; 
     Cadena Contenido; 
     _archivo *Siguiente; 
     _archivo *Anterior; 
    }; 
    typedef _archivo* Archivo; 

/* 
* Crea e inicializa un archivo con nombre 'nombreArchivo' 
*/ 
    Archivo crearArchivo(Cadena nombreArchivo){ 

     Archivo *nuevoArchivo; 
     nuevoArchivo=new Archivo; 

     (*nuevoArchivo)->Atributos="Lectura/Escritura"; 
     (*nuevoArchivo)->Contenido=NULL; 
     (*nuevoArchivo)->nombreArchivo=nombreArchivo; 
     (*nuevoArchivo)->Siguiente=NULL; 
     (*nuevoArchivo)->Anterior=NULL; 

     return *nuevoArchivo; 
    } 

@Vishnu坎瓦尔 下面的代码我在哪里调用函数:

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <cstdlib> 
#include <conio.h> 

#include "Sistema.h" 
#include "Archivo.h" 
#include "Directorio.h" 
#include "ListaArchivos.h" 
#include "Constantes.h" 
using namespace std; 


int main() 
{ 
    /* VARS */ 
    Cadena c_DIR=(char *)"DIR"; 
    Cadena c_CREATEFILE=(char *)"CREATEFILE"; 
    Cadena c_DELETE=(char *)"DELETE"; 
    Cadena c_ATTRIB=(char *)"ATTRIB"; 
    Cadena c_IF=(char *)"IF"; 
    Cadena c_DF=(char *)"DF"; 
    Cadena c_TYPE=(char *)"TYPE"; 
    Cadena c_CREARSISTEMA=(char *)"CREARSISTEMA"; 
    Cadena c_DESTRUIRSISTEMA=(char *)"DESTRUIRSISTEMA"; 
    Cadena c_EXIT=(char *)"EXIT"; 
    Cadena Segmento; 
    Cadena comando; 
    Cadena parametro1; 
    Cadena parametro2; 
    bool seguir; 
    int contador=0; 
    char frase[50]; 
    Archivo *arch; 
    ListaArchivos *lista; 

    /* DO WHILE UNTILL BOOL=TRUE */ 
    do{ 
    cout <<"> "; 

    /* ALGORITHM FOR DIVIDING THE FRASE IN TOKENS */ 
    fgets(frase,50,stdin); 
    Segmento=strtok(frase," "); 
    while(Segmento!=NULL){ 
      if(contador == 0){ 
       comando=Segmento; /* GUARDA EL COMANDO */ 
      } 
      if (contador == 1){ 
        parametro1=Segmento; /* GUARDA EL PRIMER PARAMETRO */ 
      } 
      if(contador == 2){ 
       parametro2=Segmento; /* GUARDA EL SEGUNDO PARAMETRO */ 
      } 
      Segmento=strtok(NULL, " "); 
      contador++; 
    } 

    /* SELECTS "COMANDO" COMPARING WITH THE OTHER CHAR* */ 
    if (strcmp(comando,c_DIR)== 0){ 
     cout <<"Uso comando DIR"<<endl<<endl; 
    } 
    else{ 
     if (strcmp(comando,c_CREATEFILE)== 0){ **/*HERE IS WHERE I MAKE THE CALLS*/** 

      *lista=crearListaArchivos(); 


      cout<<"LISTA CREATED SUCCESSFULLY !!"<<endl; 

      *arch=crearArchivo(parametro1); 
      cout<<"ARCHIVO CREATED"<<endl; 

      insertarArchivoListaArchivos(*lista,*arch); 

      cout <<"THE ARCHIVO WAS ADDED SUCCESFULLY !!"<<endl<<endl; 
     } 
     else{ 
      if (strcmp(comando,c_DELETE)== 0){ 
       cout <<"Uso comando DELETE "<<endl<<endl; 
      } 
      else{ 
       if (strcmp(comando,c_ATTRIB)== 0){ 
        cout <<"Uso comando ATTRIB"<<endl<<endl; 
       } 
       else{ 
        if (strcmp(comando,c_IF)== 0){ 
         cout <<"Uso comando IF"<<endl<<endl; 
        } 
        else{ 
         if (strcmp(comando,c_DF)== 0){ 
          cout <<"Uso comando DF"<<endl<<endl; 
         } 
         else{ 
          if (strcmp(comando,c_TYPE)== 0) { 
           cout <<"Uso comando TYPE"<<endl<<endl; 
          } 
          else{ 
           if (strcmp(comando,c_CREARSISTEMA)== 0){ 
            cout <<"Uso comando CREARSISTEMA"<<endl<<endl; 
           } 
           else{ 
            if (strcmp(comando,c_DESTRUIRSISTEMA)== 0){ 
             cout <<"Uso comando DESTRUIRSISTEMA"<<endl<<endl; 
            } 
            else{ 
             if (strcmp(comando,c_EXIT)==0){ 
              cout <<"Saliendo del programa..."<<endl<<endl; 
              seguir=false; 
             } 
             else{ 
              cout << "Comando incorrecto."<<endl<<endl; 
             } 
            } 
           } 
          } 
          } 
         } 
        } 
       } 
      } 
     } 
    }while(seguir); 

    return 0; 
} 

问题开始时,我主要调用函数crearArchivo和crearListaArchivo。其余的似乎工作正常。 如果您对我如何解决此错误有任何了解,请帮助我。 非常感谢你! :)

+2

您是否尝试过使用调试器来查看代码以查看故障发生的位置? – jpw

+2

打开编译器警告。你应该得到一行'(* lista) - > arch = NULL;' - 读它! –

+1

也是''lista'定义了一个指向列表的指针,但是不为它分配内存。取消引用它是UB – clcto

回答

0
ListaArchivos crearListaArchivos(){ 
    ListaArchivos *lista; 

上述LISTA_listaArchivos**和未初始化的在你的代码。 作为一个定位点(成功执行代码的下一行),你需要初始化由lista

`lista=new ListaArchivos` 

等待内存指出!到目前为止,我们有一个有效的_listaArchivos*但不_listaArchivos使其有效还需要做到:

*lista = new _listaArchivos; 

现在*lista指向内存_listaArchivos的有效对象,你可以执行你的代码的其余部分,它使用(* LISTA)。

(*lista)->arch=NULL; 

    return *lista; 
} 

编辑: 偶虽然2个new修复分配问题,但这种编码方式,使垃圾收集是一个挑战,非常难以管理。

+0

ListaArchivos crearListaArchivos(){ ListaArchivos * lista = new ListaArchivos; (* lista) - > arch = NULL; return * lista; } 现在就是这样,我想我已经分配了内存,但是仍然存在缺陷 – Bastian

+0

不,你没有。内存只分配一次,而你需要内存分配,如上面的答案 –

+0

@Bastian:crearListaArchivos(){ListaArchivos * lista = new ListaArchivos; (* lista)=新_listaArchivos; (* LISTA) - >拱= NULL;返回* lista; } –

0
ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista; 

     (*lista)->arch=NULL; 

     return *lista; 
    } 

不创建任何东西。 它只是声明一个变量并将其返回。这不是一个很好的方法。

尝试类似。

ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista = new ListaArchivos(); 

     lista->arch=NULL; 

     return *lista; 
    } 

而且对指针,内存读取,当然,这个环节在这里

resource aquisition is initialization

+1

仍然被窃听,它是一个双指针,它需要两个分配 –

+0

你在哪里看到一个“**”在这里? NULL对于拱是完全合法的。至少从问题的片段。 –

+0

它仍然被窃听,是的。你看,我必须做的是建立一个struct _archivo的列表,这个列表的类型是listaArchivo。 在crearListaArchivos()中,想法是声明,初始化并返回_archivo的列表“lista”。 – Bastian