|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Il ciclo di vita delle stringhe (*char) in C
Ho un dubbio che mi perseguita sul ciclo di vita delle stringhe in C.
Se io dichiaro a livello di procedura una stringa senza effettuare una malloc, cioè in questi modi: 1) char c[256]; 2) char *c; c = "Sono una stringa"; le stringhe continueranno in entrambi i casi ad esistere alla fine dell'esecuzione della procedura? o no? In altre parole vengono allocate sullo stack? (Il puntatore di sicuro si ma il resto?) In poche parole posso evitare di fare un'altra malloc ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
La prima no, la seconda sì.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
È chiaro che fare char c[256] e fare char *p="...." sono cose un po' diverse. Con char c[256] si alloca sullo stack un array di 256 char. Terminata la funzione, l'array sparisce. Con char *c = "blabla" si alloca sullo stack solamente un puntatore, inizializzato subito in modo da puntare ad una stringa "literal". Quest'ultima è allocata in modo fisso e permanente in un "costant string pool", una zona di memoria dove risiedono le stringhe costanti. Terminata la funzione, solo la variabile puntatore sparisce, non la stringa literal. Mentre il contenuto dell'array di char è alterabile dalla funzione, il contenuto della stringa literal non è alterabile (a seconda dell'ambiente).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Inoltre la prima forma definisce un puntatore che non può essere modificato, al contrario della seconda forma.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Permettetemi l'espressione: "Wow quanto spignete"
quindi se in una procedura ho come argomento char *c non posso sapere a priori se quella stringa punta a un qualcosa allocato sullo stack di una qualche altra procedura oppure no... che pezza ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non vedo perché ti dovrebbe interessare...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Perché se io mi "appendo" semplicemente alla stringa, quindi senza effettuare una copia, e la procedura chiamante termina trascinandosi lo stack può rimanere appesso un puntatore su un qualcosa che viene deallocato... e quindi può sorgere un problema di natura variabile...
Insomma non posso definire con rigidità(da compilatore) il contratto di un operazione che non fa altro che appendere (nel senso stendino ![]() In poche parole sono costretto a distinguere i due casi con due operazioni differenti.
__________________
Più ti avvicini alla luce, più la tua ombra diventa grande (Kingdom Hearts - Walt Disney e Squaresoft, ma la mano è della Squaresoft) |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: May 2007
Città: Roma
Messaggi: 93
|
Quote:
Non hai ragione ma di più...
__________________
Più ti avvicini alla luce, più la tua ombra diventa grande (Kingdom Hearts - Walt Disney e Squaresoft, ma la mano è della Squaresoft) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:39.