C++ 当我试图从结构列表访问内存时出现错误:";程序接收信号SIGSEGV,分段故障。”;
编辑:大家好!当我想从main访问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
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();