PDA

View Full Version : C, l'ennesima mano per un newbie


VegetaSSJ5
26-10-2003, 12:20
[Per chi non avesse voglia di leggere tutto, la domanda è in fondo alla pagina]
Salve, in questi giorni sto tempestando questo forum di domande riguardanti il c, scusatemi ma per me questo è l'unico posto dove posso chiarire i miei dubbi. Magari per voi queste possono essere domande stupide ma per uno come me sono fondamentali per non creare nella testa un casino enorme che mi fa solo confondere le idee.
Devo creare la giusta struttura dati per implementare questo problema: gestire i prestiti di una biblioteca e per ogni prestito memorizzare i seguenti dati:
-nome, cognome e matricola dello studente che preleva il testo;
-titolo, autore e codice numerico del libro;
-data del prestito;
-scadenza;
Dovrei fare anche altre cose ma quelle probabilmente ve le chiederò dopo...;) Ho scritto il seguente codice:#include <stdio.h>
#include <malloc.h>
typedef int bool;

typedef struct student *student;
typedef struct student {
char *nome;
char *cognome;
char *matricola;
};

typedef struct book *book;
typedef struct book {
char *titolo;
char *autore;
int codice;
};

typedef struct date *date;
typedef struct date {
int giorno;
int mese;
int anno;
};

typedef struct prestito *prestito;
typedef struct prestito {
student studente;
book libro;
date data;
date scadenza;
} prestitoDescriptor;

void main () {
prestito ListaPrestiti;
ListaPrestiti=(prestito) malloc (sizeof(prestitoDescriptor));
prestito armando;
armando=(prestito) malloc (sizeof(prestitoDescriptor));
armando->studente->nome="Armando";
armando->studente->cognome="Contestabile";
armando->studente->matricola="150221";
printf ("%s", armando->studente->matricola);
}il file viene compilato correttamente sia con LCC che con dev-c++, ma se eseguo l'exe prodotto da dev-c++ mi dà un errore (il debug mi dice che l'errore è nella riga armando->studente.....), ma come mai invece eseguendo l'exe di lcc non viene prodotto alcun errore e il programma termina normalmente? Adesso chiemo tutti quelli che hanno stilato il C99 e anche i produttori di dev-c++ e gliene dico quattro! :eek: :confused: :mc: :rolleyes: :oink: :muro: :sofico: :sofico:

cionci
26-10-2003, 17:51
Semplicemente perchè il codice è sbagliato:

char *nome;
char *cognome;
char *matricola;

Non sono stringhe, ma solamente puntatori a char...

Queste sono stringhe...

char nome[50];
char cognome[50];
char matricola[50];

gabriele81
27-10-2003, 15:26
Dicesi Segmentation Fault...
In pratica scrivendo char* nome_stringa, crei un puntatore a carattere ma NON allochi spazio in memoria per la stringa stessa, quindi quando lo vai ad eseguire e richiami quella stringa non sai in che porzione di memoria il dato viene scritto, se sei fortunato la scrive nella porzione riservata al processo de tuo programma, altrimenti...crash!!!
Quando devi creare una variabile che contiene una stringa alloca sempre un tot di byte (con il metodo descritto da cionci, cioè dichiarandola come array di caratteri).

VegetaSSJ5
31-10-2003, 15:27
Originariamente inviato da cionci
Semplicemente perchè il codice è sbagliato:

char *nome;
char *cognome;
char *matricola;

Non sono stringhe, ma solamente puntatori a char...

Queste sono stringhe...

char nome[50];
char cognome[50];
char matricola[50]; ho capito comunque che è sbagliato fare come ho fatto io però come mai il file compilato con lcc mi stampa correttamente la stringa della matricola?

cionci
31-10-2003, 17:50
Probabilmente con lcc viene allocato diversamente lo spazio nello heap rispetto ad altri compilatori... Ciò non vuol certo dire che lcc è migliore degli altri...è solo un caso che non ti genere un errore...

fek
01-11-2003, 10:14
E per copiare una stringa ricordati di usare la strcpy().


char str[50]; // spazio allocato

str = "stringa"; // NO! Questo e' sbagliato!
// risultato indefinito

strcpy(str, "stringa"); // Questo e' giusto