|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[c] linked list con array di char
salve, devo creare una linked list, in cui gli elementi sono stringhe, per cui ho deciso di salvarle in un array di char. Questa è la definizione della struttura list e della testa:
Codice:
/*elemento della linked list*/
struct list{
char *parole[0]; /*array di char per inserire la stringa, ha un solo elemento perchè mi serve una sola stringa per elemento list*/
struct list *next;
};
/*testa della linked list*/
typedef struct stack_link{
int cnt; /*contiene il numero di elementi*/
struct list *top; /*puntatore a top*/
}stack_link;
Codice:
void Reset(stack_link *stk_l){
stk_l -> cnt = EMPTY; /*EMPTY = -1*/
stk_l -> top = NULL;
}
void Push(char *d, stack_link *stk_l){
struct list *p; /*crea un nuovo elemento*/
p = (struct list *)malloc(sizeof(struct list)); /*ne alloca lo spazio*/
p -> parole[0] = (char *)calloc(8,sizeof(char)); /*alloco lo spazio per una nuova parola*/
strcpy(p -> parole[0], d); /*gli assegna la parola*/
printf("%s\n", p -> parole[0]); /*la parola è stata copiata correttamente*/
p -> next = stk_l -> top; /*punta all'elemento precedente della lista*/
stk_l -> top = p; /*il top dello stack punterà a questo nuovo elemento*/
stk_l -> cnt++; /*incremento il contatore degli elementi*/
printf("controllo inserimento: %s\n", stk_l -> top -> parole[0]);
}
cmq se invece di implementarla con gli array di char la implemento con i char, funziona tranquillamente. grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
sorry
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Codice:
char *parole[0]; EDIT: non ho mai visto una dichiarazione del genere ma temo che tu stia allocando un puntatore in un puntatore non inizializzato. comunque se lo trasformi in Codice:
char *parole;
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve Ultima modifica di trallallero : 12-11-2007 alle 15:44. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
fatto ti ringrazio...ora però ho un problema con pop, cioè sembra che il valore di ritorno di questa funzione è completamente sballato..fatto di simboli strani. Se in Pop provi a leggere il valore di p -> parole oppure stk_l -> top -> parole oppure il valore di d ti compare correttamente, ma chiamandola ad esempio dal main con printf("%s\n", Pop(&s)); stampa male!! A me sembra scritta bene la funzione....inoltre la memoria è liberata correttamente???
Codice:
char *Pop(stack_link *stk_l){
char *d;
struct list *p;
strcpy(d, stk_l -> top -> parole);
p = stk_l -> top;
stk_l -> top = stk_l -> top -> next;
stk_l -> cnt--;
free(p -> parole);
free(p);
return d;
}
Codice:
stack_link s;
Reset(&s);
Push("a", &s);
Push("b", &s);
printf("%s\n", Pop(&s));
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 12-11-2007 alle 17:48. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
uhm ... vedo un puntatore ... anarchico
Codice:
char *d; ... strcpy(d, stk_l -> top -> parole); ... return d; Poi ci scrivi dentro senza sapere a che indirizzo punta. Poi ritorni un puntatore locale che non ha allocato la sua memoria. 3 righe 3 errori Se vuoi ti spiego come risolvere ma se ci arrivi da solo te lo ricordi meglio poi. Fammi sapere
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
capito...ho dichiarato d, alloco la memoria per d (con malloc....), ci copio dentro il valore, restituisco d....nella funzione chiamante poi faccio una bella free....è giusto??
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
ma non so se logicamente sia giusto
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:44.




















