PDA

View Full Version : [C] Problema con programmino


Lantis_EM
26-03-2008, 10:34
Buongiorno, ho un problemuccio con questo programma, nel senso che si compila ma quando lo eseguo si crasha, credo che il problema sia legato all'istruzione strcpy. Qualcuno può aiutarmi?
Grazie.

Ininzializzare i tre campi della struttura mediante assegnazione (il campo anno) e usando la funzione strcpy per le due stringhe.



#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main (void)
{

char *a="Dennis Ritchie", *b="Il mio primo programma in C";


struct scheda
{ char *autore;
char *titolo;
int anno;
};
struct scheda *inizio; /*La struttura deve rimanere questa*/

scanf("%d",&(*inizio).anno);


strcpy(*a,(*inizio).autore);
strcpy(*b,(*inizio).titolo);

printf("%s\n%s\n%d\n",(*inizio).autore,(*inizio).titolo,(*inizio).anno);
}

Lantis_EM
26-03-2008, 11:36
Allora per allocare memoria devo utilizzare il comando:
inizio=malloc(sizeof (struct scheda));

è sempre obbligatorio per le strutture?
E come faccio ad inizializzare la struttura, io credevo che così fosse già inizializzata.

yorkeiser
26-03-2008, 14:28
E ricordati anche cha nella strcpy la stringa di destinazione è il primo parametro, quindi dovresti fare

strcpy(inizio->autore,a);
strcpy(inizio->titolo,b);

Lantis_EM
26-03-2008, 17:04
Allora se ho capito bene il codice dovrebbe essere scritto come segue allocando memoria dinamica:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main (void)
{

char *a="Dennis Ritchie", *b="Il mio primo programma in C";


struct scheda
{ char *autore;
char *titolo;
int anno;
};
struct scheda inizio;

inizio=malloc(sizeof (struct scheda*));

scanf("%d",&(inizio).anno);

(inizio)->autore = (char *) malloc(sizeof(char) *15);
(inizio)->titolo = (char *) malloc(sizeof(char) *25);

strcpy(inizio->autore,a);
strcpy(inizio->titolo,b);

printf("%s\n%s\n%d\n",(inizio).autore,(inizio).titolo,(inizio).anno);
system ("pause");
}

Però mi da lo stesso errore, caspita perché???:muro:

yorkeiser
26-03-2008, 17:18
Hai dichiarato inizio come struttura statica, non come puntatore alla struttura. Inoltre, in fase di allocazione dinamica, gli allochi uno spazio di memoria pari ad un puntatore e non all'effettiva dimensione di un elemento della tua struttura.

Ti posto il tuo codice rivisto, uso la typedef solo per comodità:

int main (void)
{

typedef struct
{
char *autore;
char *titolo;
int anno;
} scheda;

char *a="Dennis Ritchie", *b="Il mio primo programma in C";


scheda* inizio=(scheda*)malloc(sizeof(scheda));

scanf("%d",&inizio->anno);

(inizio)->autore = (char *) malloc(sizeof(char) *15);
(inizio)->titolo = (char *) malloc(sizeof(char) *25);

strcpy(inizio->autore,a);
strcpy(inizio->titolo,b);

printf("%s\n%s\n%d\n",inizio->autore,inizio->titolo,inizio->anno);
system ("pause");
}

Lantis_EM
26-03-2008, 19:17
Ti ringrazio, finalmente ho visto dove sbagliavo, posto il codice funzionante. Grazie ancora.

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main (void)
{

char *a="Dennis Ritchie", *b="Il mio primo programma in C";


struct scheda
{ char *autore;
char *titolo;
int anno;
};
struct scheda *inizio;

inizio=malloc(sizeof (struct scheda));

scanf("%d",&(*inizio).anno);

(*inizio).autore = (char *) malloc(sizeof(char) *15);
(*inizio).titolo = (char *) malloc(sizeof(char) *25);

strcpy((*inizio).autore,a);
strcpy((*inizio).titolo,b);

printf("%s\n%s\n%d\n",(*inizio).autore,(*inizio).titolo,(*inizio).anno);
system ("pause");
}

Lantis_EM
27-03-2008, 00:03
Grazie anche a te Antonio.
Farò tesoro delle vostre preziose spiegazioni

vegeta83ssj
27-03-2008, 11:42
Lantis_EM per favore modifica la firma perché è contro il regolamento:
http://www.hwupgrade.it/forum/regolamento.php :read: (Punto 1.5 comma b)

Grazie :mano: