|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
[C]Crash del programma con free()
ciao a tutti questo il codice del mio programmino...
#include <stdio.h> #include <stdlib.h> #include <string.h> struct nomi{ char *n; nomi *suc; }; int main() { nomi *inizio,*lista; char *a; int i,n; printf("Quanti nomi vuoi inserire?--> "); scanf("%d",&n); system("cls"); printf("Inseire prima stringa"); fflush(stdin); a=(char*)malloc(sizeof(char)); gets(a); inizio=(nomi*)malloc(sizeof(nomi)); inizio->n=(char*)malloc(strlen(a)*sizeof(char)+1); strcpy(inizio->n,a); lista=inizio; for(i=1; i<n; i++){ system("cls"); a=(char*)malloc(sizeof(char)); lista->suc=(nomi*)malloc(sizeof(nomi)); lista=lista->suc; printf("%d nome : ",i+1); gets(a); lista->n=(char*)malloc(strlen(a)*sizeof(char)+1); strcpy(lista->n,a); } lista->suc=NULL; fflush(stdin); while(inizio!=NULL){ printf("\n%s",inizio->n); inizio=inizio->suc; } system("pause"); free(inizio->n); free(lista); free(inizio); system("pause"); free(a); return 0; } come mai quando il programma arriva nel punto free(a); quindi dovrebbe liberare la memoria occupata da *a il programma crasha? ho provato senza free(a); e il programma esce senza problemi ma io voglio liberare quella memoria...è strana come cosa ho sbaglio?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
se hai un crash sul free ci sono due possibilità:
- doppio free su quel puntatore - accesso di memoria invalido su quel puntatore nel primo caso lo risolvi assegnando NULL a tutti i puntatore liberati (se non succede è questo il motivo) nel secondo caso bisogna trovare l'errore se programmi su linux ti consiglio di usare valgrind, valgrind [opzioni] tuo_programma e lui se ci sono degli accessi alla memoria non validi te lo dice |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Hmm, non so come hai fatto a compilare, perchè è sbagliato l'utilizzo della struttura nomi.
Se non definisci un nuovo tipo così: Codice:
typedef struct miastruttura{
int a;
char c;
}miastruttura;
Codice:
struct miastruttura miavariabile;
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Codice:
a=(char*)malloc(sizeof(char)); gets(a); E' chiaramente insufficiente; di conseguenza, la stringa inserita andra' a "sporcare" memoria altrove. Alcuni compilatori inseriscono una "No man's land", ovvero alcuni byte con valori prefissati subito dopo la tua allocazione, appunto per verificare se ha sfondato. Tali valori sono controllati al momento della free(). Cosi' vai in crash
__________________
In God we trust; all others bring data |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
|
Quote:
Ma poi, qual è il significato di allocare un solo spazio per un carattere? Codice:
char *a; a=(char*)malloc(sizeof(char));
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505
|
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
come potrei allocare più di un carattere?comunque sto usando visual c++ perchè è l'unico che mi va su windows 8..
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
eh ok questo lo sapevo,ma come faccio a sapere quanti caratteri avrà la stringa che inserisce l'utente?mi servirebbe un modo per allocarla senza sapere il numero di caratteri..
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Dopo puoi calcolare la lunghezza della stringa inserita con strlen e riallocare il buffer con realloc. |
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
mi puoi fare un esempio veloce veloce?..
|
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
http://www.cplusplus.com/reference/cstdlib/realloc/
Codice:
char *szMiaStringa = NULL;
int len;
szMiaStringa = (char*)malloc(sizeof(char) * 1024);
if ( !MiaStringa )
{
printf("Impossibile allocare la memoria. Addio!\n");
return -1;
}
printf("Inserisci una stringa: ");
fgets (szMiaStringa, 1024, stdin);
len = strlen(szMiaStringa);
szMiaStringa = realloc(szMiaStringa, len + 1);
if ( szMiaStringa )
printf("Hai inserito la stringa \"%s\". La stringa inserita è lunga %d byte.\n", szMiaStringa, len);
/* Qui altro codice */
if ( szMiaStringa )
free(MiaStringa);
Ultima modifica di Vincenzo1968 : 28-01-2013 alle 19:11. |
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
E comunque, se la memoria non è un problema, puoi evitare di riallocare il buffer:
Codice:
char *szMiaStringa = NULL;
int len;
szMiaStringa = (char*)malloc(sizeof(char) * 1024);
if ( !MiaStringa )
{
printf("Impossibile allocare la memoria. Addio!\n");
return -1;
}
printf("Inserisci una stringa: ");
fgets (szMiaStringa, 1024, stdin);
len = strlen(szMiaStringa);
if ( szMiaStringa )
printf("Hai inserito la stringa \"%s\". La stringa inserita è lunga %d byte.\n", szMiaStringa, len);
/* Qui altro codice */
if ( szMiaStringa )
free(MiaStringa);
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Nientedimeno puoi evitare del tutto(sempre se lo spazio di memoria non è un problema) di allocare il buffer sullo heap:
Codice:
char szMiaStringa[1024]
int len;
printf("Inserisci una stringa: ");
fgets (szMiaStringa, 1024, stdin);
len = strlen(szMiaStringa);
printf("Hai inserito la stringa \"%s\". La stringa inserita è lunga %d byte.\n", szMiaStringa, len);
/* Qui altro codice */
Ultima modifica di Vincenzo1968 : 28-01-2013 alle 19:23. |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
grazie provero
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Se non ti piace il colore rosso puoi cambiarlo con quello che preferisci(o toglierlo del tutto). Dovrebbe esserci la voce nel menù opzioni. EDIT: Settings -> Editor -> Syntax highlighting -> String Ultima modifica di Vincenzo1968 : 29-01-2013 alle 18:30. |
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
nome ma me le segna di rosso sotto come se avessi scritto male,un po come fa word
|
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
A me le segna in blu le stringhe:
![]() Ma posso cambiare il colore attraverso "Settings -> Editor -> Syntax highlighting -> String". Per esempio, se mi piace il rosso(e io sono di sinistra, quindi si, mi piace il rosso): ![]() |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
no a me mette dei segnetti sotto le parrole di errore come su word ,non capisco perchè...esempio printf("ciao a tutti");su ciao a tutti mi mette dei segnetti rossi
|
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Allora non saprei. Puoi fare uno screenshot?
Ultima modifica di Vincenzo1968 : 29-01-2013 alle 20:28. |
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
come?
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:36.






















