Segmentation foult

di il
1 risposte

Segmentation foult

Il programma che ho fatto va in segmentation foult a causa dell'inizializzazione di e->prossimoAppello
che è di tipo string, riuscite a capire come mai?
#include <iostream>
#include "header.h"
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/ipc.h>
using namespace std;
using namespace std;

int main(){

	int semId, shmId;

        /*Richiesta ed inizializzazione semafori*/

	semId = semget(IPC_PRIVATE, 2 , IPC_CREAT | 0664);
	cout<<"\nOttenuta chiave per i sem : "<< semId;

	semctl(semId, MUTEXL, SETVAL , 1);
	semctl(semId, SYNCH, SETVAL , 1);
	cout<<"\nMUTEXL = "<<semctl(semId, MUTEXL, GETVAL);
	cout<<"\nSYNCH = "<<semctl(semId, SYNCH, GETVAL); 



	/*Richiesta ed inizializzazione memoria condivisa */
	
	shmId = shmget(IPC_PRIVATE, sizeof(esame), IPC_CREAT | 0664);
	cout<<"\nOttenuta chiave per i shm : "<< shmId;

	esame * e = (esame *) shmat(shmId,0,0);
	e->prossimoAppello = "aaa";                             ///////////////////////////////////////QUI///////////////
	e->numPrenotati = 0;
	e->numLettori = 0;	
	
	cout<<endl<<e->prossimoAppello ;
	cout<<endl<<e->numPrenotati;
	cout<<endl<<e->numLettori;
	
	
	cout<<endl<<endl;
}
questo è l'header.h
#ifndef HEAD
#define HEAD
#include <string>
using namespace std;

#define MUTEXL 0
#define SYNCH  1


typedef struct{
	string prossimoAppello;
	int numPrenotati;
	int numLettori;	
}esame;

void wait(int,int);
void signal(int,int);

void inizioLettura(int, esame *);
void fineLettura(int, esame *);
void inizioScrittura(int);
void fineScrittura(int);

void scrivi(int, esame*);
void leggi(int ,esame*);



#endif

1 Risposte

  • Re: Segmentation foult

    Non puoi serializzare/deserializzare con un cast una struttura/classe contenenti a loro volta oggetti STL e/o puntatori. O converti prossimoappello in char[MAX_LEN] oppure devi prevedere dei meccanismi di serializzazione/deserializzazione della struttura esame.

    Il motivo è che quando converti con un cast la struttura esame, l'intera struttura viene convertita in char* rendendo spazzatura quanto hai scritto in prossimoappello, in quanto sono i puntatori interni a std::string a essere convertiti in char* non quello a cui puntano.

    In fase di deserializzazione ti ritrovi con un oggetto std::string la cui struttura interna contiene solo spazzatura, dati casuali e puntatori interni invalidi, per cui tutto fallisce miseramente.
    Di solito questo errore concettuale viene commesso quando si effettuano cose simili alla tua, ma operando su file. In quel caso ti saresti accorto che ciò che scrivevi non era quanto contenuto nella struttura stessa.
Devi accedere o registrarti per scrivere nel forum
1 risposte