0

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

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 Kanwar 这是我调用函数的代码:

#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;
}

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

4

2 回答 2

0
 ListaArchivos crearListaArchivos(){
        ListaArchivos *lista;

        (*lista)->arch=NULL;

       return *lista;
    }

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

尝试类似的东西。

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

        lista->arch=NULL;

       return *lista;
    }

并阅读指针、内存,当然还有这里的链接

资源获取是初始化

于 2013-11-02T19:45:20.697 回答
0
ListaArchivos crearListaArchivos(){
    ListaArchivos *lista; 

上面的lista是 a_listaArchivos**并且在您的代码中未初始化。作为修复(要成功执行代码的下一行),您需要初始化指向的内存lista

`lista=new ListaArchivos`

等待!到目前为止,我们有一个有效_listaArchivos*但不_listaArchivos使其有效,您还需要这样做:

*lista = new _listaArchivos;

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

    (*lista)->arch=NULL;

   return *lista;
}

编辑:尽管有两个new修复了分配问题,但这种编码风格使垃圾收集成为一个挑战并且很难管理。

于 2013-11-02T21:04:07.380 回答