当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."

Bug when I try to access memory from a list of a struct: " Program received signal SIGSEGV, Segmentation fault."

本文关键字:Program 错误 received signal fault Segmentation SIGSEGV 结构 列表 内存 访问      更新时间:2023-10-16

编辑: 大家好!当我想从main访问lista->arch->nombreArchivo中的数据时,我遇到了这个特定代码的问题。程序崩溃,当我调试它时,我发现问题是"分段错误"类型的错误。我想我缺少分配,但我不知道在哪里。

代码如下:

#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()
{
    /* VARIABLES */
    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; /here i declare arch
    ListaArchivos *lista; //here i declare lista
    /* ESTRUCTURA DE REPETICION PARA QUE EFECTUE EL COMANDO PEDIDO HASTA QUE EL BOOL SALIR SEA FALSO, MEDIANTE EL COMANDO EXIT */
    do{
    cout <<"> ";
    /* ALGORITMO PARA DIVIDIR LA FRASE EN 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++;
    }
    /* SELECCIONA EL COMANDO INDICADO, COMPARANDO LA CADENA COMANDO CON LAS DIFERENTES CADENAS */
    if (strcmp(comando,c_DIR)== 0){
        cout <<"Uso comando DIR"<<endl<<endl;
    }
    else{
        if (strcmp(comando,c_CREATEFILE)== 0){
            *lista=crearListaArchivos(); //CREATE LIST OF ARCH.

            cout<<"LISTA CREted, SU DIRECCION ES "<< &lista<<endl;
            *arch=crearArchivo(parametro1); //CREATE ARCH
            cout<<"ARCHIVO CREAted, SU DIRECCION ES"<<&arch<<" SU NOMBRE ES: "<<(*arch)->nombreArchivo<<endl;
            insertarArchivoListaArchivos(*lista,*arch); //INSERTS ARCH IN LIST OF ARCHS but Im not certain that it actually inserts it. 
            cout <<" THE ARCHIVO IN lista es named ..."<<(*lista)->arch->nombreArchivo<<endl<<endl; //here it crashes
        }
/* ....
......
......
.....*/
    return 0;
}

阿奇沃的标题

struct _archivo{  //aca declaro la estructura de un 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=new Archivo; //inicializo
    (*nuevoArchivo)=new _archivo;
    // lo inicializo
 //   (*nuevoArchivo)->Atributos=(char* )"Lectura/Escritura";
 //   (*nuevoArchivo)->Contenido=NULL;
    (*nuevoArchivo)->nombreArchivo=nombreArchivo;
    (*nuevoArchivo)->Siguiente=NULL;
    (*nuevoArchivo)->Anterior=NULL;
    return *nuevoArchivo; //devuelvo el archivo inizializado
}
列表

列表的标题

struct _listaArchivos{ //defino la estructura _listaArchivos, que sera una lista de nodos de tipo Archivo, definidos en el header Archivo.h
    Archivo arch;
};
typedef _listaArchivos* ListaArchivos;
/*
 * creates initializes and return a new lista of archivo.
 */
/*
ListaArchivos crearListaArchivos(){
           ListaArchivos *lista; //cuando lo corro al programa, con el debugger, me manda a esta funcion.
            lista=new ListaArchivos;
        *lista=new _listaArchivos;
       (*lista)->arch=NULL;
       return *lista;}*/
ListaArchivos crearListaArchivos(){
     ListaArchivos *lista = new ListaArchivos;
     (*lista) = new _listaArchivos;
     (*lista)->arch=NULL;
     return *lista;
}
/*
 * Inserta el archivo 'archivo' en la lista '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;
    }/*falta terminar, no interesa*/
}

如果您能给我一些关于如何解决此错误的想法,Id 真的很感谢你。非常感谢!

您的crearArchivocrearListaArchivos函数只是...错!

由于 ArchivoListaArchivos 类型已经是指针,因此无需使用您分配的额外间接级别(并且不能释放,从而创建内存泄漏)。

例如,crearListaArchivos函数可以像

ListaArchivos crearListaArchivos(){
     ListaArchivos lista = new _listaArchivos;
     lista->arch=NULL;
     return lista;
}

crearArchivo做类似的事情。


至于崩溃,请参阅以下行:

ListaArchivos *lista;
...
*lista=crearListaArchivos();

当您声明局部变量时,它的值是不确定的,因此在其初始化之前访问它会导致未定义的行为。这里你有一个未初始化的指针(lista),即不指向任何地方,然后你使用*lista取消引用那个未初始化的指针,这会导致未定义的行为和崩溃。

您首先需要做的是删除所有额外的间接寻址!ListaArchivos类型已经是一个指针,没有必要让它成为指向指针的指针!所以这将是你想要的:

ListaArchivos lista;
...
lista=crearListaArchivos();