【问题标题】:"Segmentation fault" when I make a call in main当我在 main 中拨打电话时出现“分段错误”
【发布时间】:2013-11-03 14:18:56
【问题描述】:

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

注意:我想做的是列出struct _archivo 的列表(listaArchivo),所以错误可能在函数insertarArchivoListaArchivos() 中。

这是 main() 代码:

#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;
    ListaArchivos lista;


    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

            cout <<" THE ARCHIVO IN lista es named ..."<<lista->arch->nombreArchivo<<endl<<endl;
        }  /*the problem seems to be when I make this call*/ 

...............................
...............................
...............................

这是档案标题:

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){

    //inicializo
    Archivo nuevoArchivo=new _archivo;

    nuevoArchivo->nombreArchivo=nombreArchivo;
    nuevoArchivo->Siguiente=NULL;
    nuevoArchivo->Anterior=NULL;
    return nuevoArchivo; //devuelvo el archivo inizializado
}

这是 listaArchivos 标题:

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;

/*
 * Crea, inicializa y retorna una nueva lista de archivos.
 */
ListaArchivos crearListaArchivos(){
     ListaArchivos lista = new _listaArchivos;
     lista->arch=NULL;
     return lista;
}
/*
 * Inserta el archivo 'archivo' en la lista 'lista'.
 */
void insertarArchivoListaArchivos(ListaArchivos &lista, Archivo archivo){
    ListaArchivos cabezal;

    if (lista==NULL){
        lista->arch=archivo;
        lista->arch->Anterior=NULL;
        lista->arch->Siguiente=NULL;
    }
    else{
        cabezal=lista;
        while (!cabezal->arch->Siguiente)
            cabezal->arch=cabezal->arch->Siguiente;
        cabezal->arch->Siguiente=archivo;
        archivo->Siguiente=NULL;
        archivo->Anterior=cabezal->arch->Siguiente;
    }
}

我能做什么?同时,我将继续阅读有关指针/列表的内容并尝试弄清楚。

【问题讨论】:

  • 你的调试器说哪一行导致了段错误?
  • 请不要大喊大叫。并且请不要试图让人们为你玩调试器。
  • 导致问题的那一行是 main() cout arch->nombreArchivo
  • 请看一下指南SSCCE。这将有助于大大改善您的问题。
  • listalista-&gt;arch 为 null(或其他无效),或者重载的 operator&lt;&lt; 内部出现其他问题。当您在调试器中单步调试代码时应该很容易发现问题,但从您发布的代码中很难猜到。

标签: c++ list function segmentation-fault call


【解决方案1】:

以下是我发现的一些可能导致您的问题的问题:

使用字符串时,字符 0、'0' 和数字 0 之间存在差异。您需要将数字的文本表示形式转换为内部表示形式。

由于您将问题标记为 C++,我建议您使用 std::stringfind 方法而不是 C 函数 strtok。在 StackOverflow 中搜索“[c++] 解析号”。

使用命名标识符而不是幻数。
例如使用:

`#define MAXIMUM_ARRAY_SIZE 50`  
`//...`  
`char frase[MAXIMUM_ARRAY_SIZE];`  
`//...`  
`fgets(frase, MAXIMUM_ARRAY_SIZE, stdin);`   

这可确保您只需在一处更改号码,所有代码都将使用相同的号码。

由于您使用的是 C++,请使用std::list,不要浪费时间创建您自己的链表。 std::list 已经过测试,因此您无需对其进行测试。

要使用 C++ 读取菜单选择,请尝试:

int selection;
cin >> selection;
switch (selection)
{
  //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多