Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我试图从结构列表访问内存时出现错误:";程序接收信号SIGSEGV,分段故障。”;_C++_List_Header_Segmentation Fault - Fatal编程技术网

C++ 当我试图从结构列表访问内存时出现错误:";程序接收信号SIGSEGV,分段故障。”;

C++ 当我试图从结构列表访问内存时出现错误:";程序接收信号SIGSEGV,分段故障。”;,c++,list,header,segmentation-fault,C++,List,Header,Segmentation Fault,编辑:大家好!当我想从main访问lista->arch->nombreArchivo中的数据时,我对这个特定的代码有问题。程序崩溃了,当我调试它时,我发现问题是“分段错误”——一种错误。我想我缺少分配,但我不知道在哪里 代码如下: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cstdlib> #incl

编辑:大家好!当我想从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;
}
列表列表的标题AARCHIVO

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*/
}
如果你能告诉我如何修复这个错误,我真的很感谢你。
非常感谢

您的
crearArchivo
crearListaArchivos
函数只是。。。错了

由于
Archivo
ListaArchivos
类型已经是指针,因此不需要使用您分配的额外级别的间接寻址(并且无法释放,从而造成内存泄漏)

例如,
crearlistarchivos
函数可以重写如下

ListaArchivos crearListaArchivos(){
     ListaArchivos lista = new _listaArchivos;
     lista->arch=NULL;
     return lista;
}
crearArchivo
执行类似操作


关于碰撞,请参见以下几行:

ListaArchivos *lista;

...

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

您首先需要做的是删除所有额外的间接操作!
ListaArchivos
类型已经是指针,无需将其设置为指向指针的指针!这就是你想要的:

ListaArchivos lista;

...

lista=crearListaArchivos();

为什么您使用的是
cout
而不是
cin
?当您在调试器中运行程序时,它在哪里崩溃?回溯是什么?@JoachimPileborg Cadena是在其他标题中定义的字符*。我使用cout,对于in,我在do while的顶部使用fgets。当我试图访问缅因州lista中的信息时,程序崩溃,你听说过吗?如果不是,那么你现在就做。不要使用
char*
来处理字符文本,可以使用
const char*
char[]
。我知道还有更有效的方法,问题是这是大学里给我的一个问题,我无法更改标题或定义。非常感谢你的提示,谢谢你,约阿希姆,那帮了大忙!我希望我能投票表决这个问题,但我不能只是雪人在梅因对lista做了那些更改,我必须在梅因对arch做同样的更改吗?好的,现在的问题是。。当我想访问lista->arch->nombreArchivo中的数据时,程序仍在崩溃;大体上。为什么呢?我想知道我在列表中添加了什么
ListaArchivos lista;

...

lista=crearListaArchivos();