当我尝试从结构列表中访问内存时出现错误:" 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."
编辑: 大家好!当我想从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 真的很感谢你。非常感谢!
您的crearArchivo
和crearListaArchivos
函数只是...错!
由于 Archivo
和 ListaArchivos
类型已经是指针,因此无需使用您分配的额外间接级别(并且不能释放,从而创建内存泄漏)。
例如,crearListaArchivos
函数可以像
ListaArchivos crearListaArchivos(){
ListaArchivos lista = new _listaArchivos;
lista->arch=NULL;
return lista;
}
对crearArchivo
做类似的事情。
至于崩溃,请参阅以下行:
ListaArchivos *lista;
...
*lista=crearListaArchivos();
当您声明局部变量时,它的值是不确定的,因此在其初始化之前访问它会导致未定义的行为。这里你有一个未初始化的指针(lista
),即不指向任何地方,然后你使用*lista
取消引用那个未初始化的指针,这会导致未定义的行为和崩溃。
您首先需要做的是删除所有额外的间接寻址!ListaArchivos
类型已经是一个指针,没有必要让它成为指向指针的指针!所以这将是你想要的:
ListaArchivos lista;
...
lista=crearListaArchivos();
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- 错误"<url> is not recognized as an internal or external command, operable program or batch file.
- 错误 PRJ0002:错误结果 -1073741515 从"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.
- 很多杂散错误 - "error: stray ‘210’ in program in C++"
- C++排序程序中"Stray 1 in program"错误
- 当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."
- SDL2 + OpenGL = Gnome 3 错误地抱怨"Program not responding"
- C++ QT libXL 错误:"During Startup program exited with code 0xc0000135"
- 错误MSB6006:代码 9009 "cmd.exe";命令"C:Program"
- 如何知道当程序在运行时崩溃时是否是内存错误"the program has stopped working"
- "Program is not a recognized executable" Eclipse 中的错误
- 如何修复调用 Process32First() 时"The program issued a command but the command length is incorrect."错误?